Существует ли эквивалент C для модуля Карпа Perl?

Судите игрового производителя 7 http://www.yoyogames.com/gamemaker/

7
задан brian d foy 20 October 2009 в 05:53
поделиться

4 ответа

Но мне нужно что-то получше с доступом к именам файлов, строк и функций в стеке вызовов, например подпрограмма вызывающего Perl.

Проблема в том, что для этого требуется помощь программиста. решите, где находится граница между кодом вашей библиотеки и подпрограммой «вызывающего». Perl использует для этого некую магию (известную как эвристика); возможно, вы могли бы сделать то же самое с функциями обратной трассировки. Но в целом это нетривиально.

1
ответ дан 7 December 2019 в 16:43
поделиться

Ну, я никогда не пытался показать стек вызовов, но для своих программ я делал следующее:

Во-первых, я определяю функцию, которая фактически ведет журнал. Это просто пример ; обратите внимание, что эта функция очень небезопасна (кто-нибудь переполняет буфер?)

void strLog(char *file, char *function, int line, char *fmt, ...)
{
     char buf[1024];
     va_list args;

     va_start(args, fmt);
     vsprintf(buf, fmt, args);
     va_end(args);

     fprintf(stderr, "%s:%s:%d:%s\n", file, function, line, buf);
}

Однако это не очень практично. Практично использовать макрос для вызова этой функции.

#define die( ... ) \
        strLog( __FILE__, __PRETTY_FUNCTION__, \
        __LINE__, __VA_ARGS__ )

Затем вы можете вызвать так же, как printf () .

if (answer == 42) die("Oh, %d of course.", answer);

, и вы получите что-то вроде этого:

main.c:10:somefunc: Oh, 42 of course.

Ну, без обратной трассировки но кое-что есть.

1
ответ дан 7 December 2019 в 16:43
поделиться

Похоже, что не существует ничего похожего на модуль Carp для использования в программах на C, поэтому я написал небольшую библиотеку для этого на github .

В библиотеке есть следующие экспорты определены для использования:

warn, die
carp, croak
cluck, confess

и я добавил электронные варианты предыдущих для добавления строк errno в предупреждение, так как я подумал, что это будет полезно:

ewarn, edie
ecarp, ecroak
ecluck, econfess

Например, если вы пишете библиотеку и хотите Чтобы придраться к проблеме, просто используйте

carp("%d is not a Fibonacci number!", 54);

И он отобразит файл и номер строки первой функции, вызываемой в вашу библиотеку.

Модуль Carp Perl использует другой пакет вместо файла для поиска подозрительной подпрограммы . Он также рекурсивно использует массив @ISA или @CARP_NOT, чтобы определить, какая подпрограмма находится за пределами доверенной группы пакетов. Я собираюсь добавить что-то подобное.

1
ответ дан 7 December 2019 в 16:43
поделиться

Я написал процедуру обратной трассировки для своих встроенных приложений C (gcc). Он использует информацию -gstabs, если она доступна для поиска имен функций. Одно предостережение заключается в том, что файл elf должен быть где-то, где программа может его найти, чтобы искать в сегменте ударов. В моих встроенных приложениях файл elf находится во флэш-памяти, и у меня есть указатель на него. В вашем случае вам придется написать код, чтобы прочитать его с диска.

Я почти уверен, что файл и номер строки также находятся в сегменте stabs.

Это похоже на то, что могло бы помочь тебе?

0
ответ дан 7 December 2019 в 16:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: