36 #ifndef VIGRA_PRINT_BACKTRACE_HXX
37 #define VIGRA_PRINT_BACKTRACE_HXX
64 static char * program_name;
66 static int vigra_addr2line(
void const *
const addr)
68 char addr2line_cmd[512] = {0};
69 sprintf(addr2line_cmd,
"addr2line -C -f -p -i -e %.256s %p", program_name, addr);
70 return system(addr2line_cmd);
73 static void vigra_print_backtrace(
int sig)
75 int i, trace_size = 0;
76 char **messages = (
char **)NULL;
77 static const int BACKTRACE_SIZE = 100;
78 void *stack_traces[BACKTRACE_SIZE];
80 fprintf(stderr,
"caught signal %d, printing backtrace\n\n", sig);
82 trace_size = backtrace(stack_traces, BACKTRACE_SIZE);
83 messages = backtrace_symbols(stack_traces, trace_size);
85 for (i = 0; i < trace_size; ++i)
87 if (vigra_addr2line(stack_traces[i]) != 0)
89 fprintf(stderr,
" error determining line # for: %sn", messages[i]);
92 if (messages) { free(messages); }
96 #endif // VIGRA_PRINT_BACKTRACE_HXX