| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | |
| | |
| |
|
| | #include <assert.h> |
| | #include <dlfcn.h> |
| | #include <signal.h> |
| | #include <stdio.h> |
| | #include <stdlib.h> |
| | #include <string.h> |
| | #include <sys/types.h> |
| | #include <unistd.h> |
| | #include <unwind.h> |
| |
|
| | _Unwind_Reason_Code frame_handler(struct _Unwind_Context* ctx, void* arg) { |
| | (void)arg; |
| | Dl_info info = { 0, 0, 0, 0 }; |
| | assert(dladdr((void*)_Unwind_GetIP(ctx), &info)); |
| |
|
| | |
| | if(info.dli_sname && !strcmp("main", info.dli_sname)) { |
| | _Exit(0); |
| | } |
| | return _URC_NO_REASON; |
| | } |
| |
|
| | void signal_handler(int signum) { |
| | (void)signum; |
| | _Unwind_Backtrace(frame_handler, NULL); |
| | _Exit(-1); |
| | } |
| |
|
| | int* faultyPointer = NULL; |
| |
|
| | __attribute__((noinline)) void crashing_leaf_func(void) { |
| | *faultyPointer = 0; |
| | } |
| |
|
| | int main() { |
| | signal(SIGSEGV, signal_handler); |
| | crashing_leaf_func(); |
| | return -2; |
| | } |