Nov 20, 2015 19:39
Годный обработчик для SIGSEGV, SIGILL, SIGBUS и прочих сигналов.
Получаем вполне вменяемый стектрейс, даже если позабыли выставить правильный лимит на коры.
#include
#include
#include
#include
void stacktrace(int signum, siginfo_t *siginfo, void *context)
{
fprintf(stderr, "Received signal %i\n", signum);
// Backtrace
void *btrace[BACKTRACE_SIZE];
size_t stacklen = backtrace(btrace, BACKTRACE_SIZE);
char **symbols = backtrace_symbols(btrace, stacklen);
if (!symbols)
{
fprintf(stderr, "backtrace_symbols() failed\n");
signal(signum, SIG_DFL);
return;
}
for (size_t i = 1; i < stacklen; i++)
{
char *mangled_name = 0, *offset_begin = 0, *offset_end = 0;
for (char *p = symbols[i]; *p; ++p)
{
if (*p == '(')
mangled_name = p;
else if (*p == '+')
offset_begin = p;
else if (*p == ')')
{
offset_end = p;
break;
}
}
if (mangled_name && offset_begin && offset_end &&
mangled_name < offset_begin)
{
*mangled_name++ = '\0';
*offset_begin++ = '\0';
*offset_end++ = '\0';
int status;
char * real_name = abi::__cxa_demangle(mangled_name, 0, 0, &status);
// if demangling is successful, output the demangled function name
if (status == 0)
fprintf(stderr, "(%i) %s : %s+%s%s\n", i, symbols[i], real_name, offset_begin, offset_end);
// otherwise, output the mangled function name
else
fprintf(stderr, "(%i) %s : %s+%s%s\n", i, symbols[i], mangled_name, offset_begin, offset_end);
free(real_name);
}
// otherwise, print the whole line
else
fprintf(stderr, "(%i) %s\n", i, symbols[i]);
}
free(symbols);
signal(signum, SIG_DFL);
return;
}
Результат работы:
Received signal 11
(1) /lib64/libc.so.6() [0x3bf5434960]
(2) /lib64/libc.so.6() [0x3bf5545c8a]
(3) /home/froller/Perforce/elverils_penguin/LSProjects/build_linux/shared/bin/EoCApp : ls::crashme()+0x50 [0xbe1610]
(4) /home/froller/Perforce/elverils_penguin/LSProjects/build_linux/shared/bin/EoCApp : main+0x17a [0xbe0e0a]
(5) /lib64/libc.so.6 : __libc_start_main+0xf0 [0x3bf541ffe0]
(6) /home/froller/Perforce/elverils_penguin/LSProjects/build_linux/shared/bin/EoCApp() [0xbe0bb4]
хозяйке на заметку,
ИТ,
работа