#include #include #include #include #include #include #include void (*f)(void); jmp_buf env; void *stack[64]; size_t stackdepth; char **symbols; void sigsegv(int signo) { (void)signo; stackdepth = backtrace(stack, __arraycount(stack)); longjmp(env, 1); } int main(void) { size_t i; if (signal(SIGSEGV, &sigsegv) == SIG_ERR) err(1, "signal(SIGSEGV)"); if (setjmp(env) == 0) (*f)(); symbols = backtrace_symbols(stack, stackdepth); if (symbols == NULL) err(1, "backtrace_symbols"); for (i = 0; i < stackdepth; i++) printf("%s\n", symbols[i]); fflush(stdout); return ferror(stdout); }