summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-22 12:56:46 +0200
committerGravatar Alexey Yakovenko <wakeroid@gmail.com>2010-05-22 12:56:46 +0200
commitd06261ccac56987f57258b679bb1db2ced1ec41f (patch)
treeeb6842cc4504edba5e2a2fa976c3f4340a9e79ec /main.c
parentcacfeb0d9749074f6fd58fb58db3e8dcf7a2a139 (diff)
added sigsegv handler with backtrace
Diffstat (limited to 'main.c')
-rw-r--r--main.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/main.c b/main.c
index 36133bcf..50644574 100644
--- a/main.c
+++ b/main.c
@@ -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");