#include #include "libunwind.h" #include #include #include void show_backtrace (void) { char name[256]; unw_cursor_t cursor; unw_word_t ip, sp, offp; unw_context_t uc; unw_getcontext(&uc); if ( unw_init_local(&cursor, &uc) != 0) { return; } while (unw_step(&cursor) > 0) { char file[256]; int line = 0; name[0] = '\0'; int iResult = unw_get_proc_name(&cursor, name, 256, &offp); if ( iResult != UNW_ESUCCESS ) { return; } unw_get_reg(&cursor, UNW_REG_IP, &ip); unw_get_reg(&cursor, UNW_REG_SP, &sp); printf ("%s ip = %lx, sp = %lx\n", name, (long) ip, (long) sp); } } static sighandler_t sys_signal_add (int sig_nr, sighandler_t signalhandler) { struct sigaction add_sig; if (sigaction (sig_nr, NULL, &add_sig) < 0) return SIG_ERR; add_sig.sa_handler = signalhandler; sigaddset (&add_sig.sa_mask, sig_nr); add_sig.sa_flags = SA_RESTART; if (sigaction (sig_nr, &add_sig, NULL) < 0) return SIG_ERR; return add_sig.sa_handler; } static void check_sys_sig ( int sig_nr ) { show_backtrace(); raise (SIGKILL); } int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); sys_signal_add (SIGSEGV, check_sys_sig); *(int *)0=0; return a.exec(); }