1 #include "cado.h" // IWYU pragma: keep
2
3 #include <cstdio> // for fprintf, stderr
4 #include <cstring> // for strsignal
5
6 #ifdef HAVE_CXXABI_H
7 /* We use that to demangle C++ names */
8 #include <cxxabi.h> // IWYU pragma: keep
9 #endif
10 #ifdef HAVE_GLIBC
11 #include <execinfo.h> // for backtrace, backtrace_symbols
12 #include <csignal> // for signal, raise, SIGABRT, SIGSEGV
13 #else
14 #include "verbose.h" // verbose_output_print
15 #endif
16 #include "cado-sighandlers.h"
17
18 #ifdef HAVE_GLIBC
signal_handling(int signum)19 static void signal_handling (int signum)/*{{{*/
20 {
21 fprintf (stderr, "*** Error: caught signal \"%s\"\n", strsignal (signum));
22
23 int sz = 100, i;
24 void *buffer [sz];
25 char** text;
26
27 sz = backtrace (buffer, sz);
28 text = backtrace_symbols (buffer, sz);
29
30 fprintf(stderr, "======= Backtrace: =========\n");
31 for (i = 0; i < sz; i++)
32 fprintf (stderr, "%s\n", text [i]);
33
34 signal (signum, SIG_DFL);
35 raise (signum);
36 }/*}}}*/
37 #endif
38
cado_sighandlers_install()39 void cado_sighandlers_install()
40 {
41 #ifdef HAVE_GLIBC
42 signal (SIGABRT, signal_handling);
43 signal (SIGSEGV, signal_handling);
44 #else
45 verbose_output_print(0, 0, "# Cannot catch signals in an interesting way, lack glibc support\n");
46 #endif
47 }
48
49