#include #include #include #include #include #include #include #include #include #define UNW_LOCAL_ONLY #include void local_backtrace() { unw_cursor_t cursor; unw_context_t uc; unw_word_t ip, sp, offset; unw_getcontext(&uc); unw_init_local(&cursor, &uc); char name[1000]; while (unw_step(&cursor) > 0) { unw_get_reg(&cursor, UNW_REG_IP, &ip); unw_get_reg(&cursor, UNW_REG_SP, &sp); memset(name, 0, sizeof(char) * 1000); unw_get_proc_name(&cursor, name, sizeof(char) * 1000, &offset); printf ("ip = %lx, sp = %lx offset = %lx name = %s\n", (long) ip, (long) sp, (long) offset, name); } } void handle_sigsegv(int signal, siginfo_t *info, void *ucontext) { printf("Handler called\n"); local_backtrace(); exit(-1); } void (*invalid_function)() = (void*)1; void crash() { invalid_function(); } int main(int argc, char *argv[]) { struct sigaction sa; memset(&sa, 0, sizeof(sa)); sa.sa_sigaction = handle_sigsegv; sa.sa_flags = SA_SIGINFO; sigaction(SIGSEGV, &sa, NULL); crash(); return 0; }