используйте функцию обратного вызова, чтобы сообщить об обратном следе стека - PullRequest
1 голос
/ 29 мая 2010

Предположим, у меня есть следующее:

typedef struct {
   char *name;
   char binding;
   int address;
} Fn_Symbol               //definition of function symbol

static Fn_Symbol *fnSymbols; //array of function symbols in a file
statc int total;  //number of symbol functions in the array and file

static void PrintBacktrace(int sigum, siginfo_t * siginfo, void *context)
{
   printf("\nSignal received %d (%s)\n", signum, strsignal(signum));
   const int eip_index = 14; 
   void *eip = (void *)((struct ucontext *)context)->uc_mcontext.gregs[eip_index];
   printf("Error at [%p]  %s (+0x%x), eip, fnName, offset from start); //?????
   exit(0);
}

Пока у меня есть это, но как лучше всего использовать статический глобальный указатель fnSymbols для определения функции, где произошла ошибка, а затем выполнить обратный трассировку через стек для идентификации каждой вызывающей функции по адресу, имени и смещению? 1004 *

Ответы [ 2 ]

1 голос
/ 29 мая 2010
0 голосов
/ 06 января 2011

В Linux найдите инструмент с именем addr2line .

Ваше приложение должно быть скомпилировано с опцией -rdynamic . Следующее:

addr2line 0x8048a76 -f -e app_name

выводит имя функции, а также номер строки в исходном коде.

...