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