diff options
author | Alexey Yakovenko <wakeroid@gmail.com> | 2010-05-22 12:56:46 +0200 |
---|---|---|
committer | Alexey Yakovenko <wakeroid@gmail.com> | 2010-05-22 12:56:46 +0200 |
commit | d06261ccac56987f57258b679bb1db2ced1ec41f (patch) | |
tree | eb6842cc4504edba5e2a2fa976c3f4340a9e79ec | |
parent | cacfeb0d9749074f6fd58fb58db3e8dcf7a2a139 (diff) |
added sigsegv handler with backtrace
-rw-r--r-- | main.c | 34 |
1 files changed, 32 insertions, 2 deletions
@@ -38,6 +38,7 @@ #include <sys/fcntl.h> #include <sys/errno.h> #include <signal.h> +#include <execinfo.h> #ifdef HAVE_CONFIG_H # include <config.h> #endif @@ -427,10 +428,39 @@ sigterm_handler (int sig) { exit (0); } +void +sigsegv_handler (int sig) { + fprintf (stderr, "Segmentation Fault\n"); + int j, nptrs; +#define SIZE 100 + void *buffer[100]; + char **strings; + + nptrs = backtrace(buffer, SIZE); + printf("backtrace() returned %d addresses\n", nptrs); + + /* The call + * backtrace_symbols_fd(buffer, + * nptrs, + * STDOUT_FILENO) + would produce similar output to the following: */ + + strings = backtrace_symbols(buffer, nptrs); + if (strings == NULL) { + perror("backtrace_symbols"); + exit(EXIT_FAILURE); + } + + for (j = 0; j < nptrs; j++) + printf("%s\n", strings[j]); + + free(strings); + exit (0); +} + int main (int argc, char *argv[]) { - //u8_lc_map_test (); - //return -1; + signal (SIGSEGV, sigsegv_handler); setlocale (LC_ALL, ""); setlocale (LC_NUMERIC, "C"); fprintf (stderr, "starting deadbeef " VERSION "\n"); |