есть функция glibc backtrace .На странице man приведен пример вызова:
#define SIZE 100
void myfunc3(void) {
int j, nptrs;
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
Для получения дополнительной информации см. Страницу руководства.
Трудно сказать, действительно ли это гарантированно работает из обработчика сигнала, посколькуPosix перечисляет только несколько реентерабельных функций, которые гарантированно будут работать.Помните: обработчик сигнала может быть вызван, в то время как остальная часть вашего процесса находится прямо в середине вызова malloc.
My думаю, в том, что это обычно работает, но может произойти сбой извремя от времени.Для отладки этого может быть достаточно.