Судите игрового производителя 7 http://www.yoyogames.com/gamemaker/
Но мне нужно что-то получше с доступом к именам файлов, строк и функций в стеке вызовов, например подпрограмма вызывающего Perl.
Проблема в том, что для этого требуется помощь программиста. решите, где находится граница между кодом вашей библиотеки и подпрограммой «вызывающего». Perl использует для этого некую магию (известную как эвристика); возможно, вы могли бы сделать то же самое с функциями обратной трассировки. Но в целом это нетривиально.
Ну, я никогда не пытался показать стек вызовов, но для своих программ я делал следующее:
Во-первых, я определяю функцию, которая фактически ведет журнал. Это просто пример ; обратите внимание, что эта функция очень небезопасна (кто-нибудь переполняет буфер?)
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.
Ну, без обратной трассировки но кое-что есть.
Похоже, что не существует ничего похожего на модуль 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, чтобы определить, какая подпрограмма находится за пределами доверенной группы пакетов. Я собираюсь добавить что-то подобное.
Я написал процедуру обратной трассировки для своих встроенных приложений C (gcc). Он использует информацию -gstabs, если она доступна для поиска имен функций. Одно предостережение заключается в том, что файл elf должен быть где-то, где программа может его найти, чтобы искать в сегменте ударов. В моих встроенных приложениях файл elf находится во флэш-памяти, и у меня есть указатель на него. В вашем случае вам придется написать код, чтобы прочитать его с диска.
Я почти уверен, что файл и номер строки также находятся в сегменте stabs.
Это похоже на то, что могло бы помочь тебе?