You can crash my party any time

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]

хозяйке на заметку, ИТ, работа

Previous post Next post
Up