#include #include struct _Unwind_Context; typedef int (*_Unwind_Trace_Fn)(struct _Unwind_Context *, void *vdata); extern int _Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument); extern int _Unwind_Backtrace_Checked(_Unwind_Trace_Fn trace, void * trace_argument); extern void *_Unwind_GetIP (struct _Unwind_Context *context); int simple_unwind (struct _Unwind_Context *context, void *vdata) { printf("Next frame: "); void *pc = _Unwind_GetIP(context); printf("%p\n", pc); return 0; } #define noinline __attribute__((noinline)) noinline int foo() { // Clobber stack to provoke errors in unwinder int x; void *p = &x; asm("" :: "r"(p)); memset(p, 0xa, 128); printf("After clobbering stack\n"); int ret = _Unwind_Backtrace(simple_unwind, 0); printf("After unwind: %d\n", ret); return 0; } noinline int bar() { int x = foo(); return x + 1; } int main() { bar(); return 0; }