#include "cado.h" // IWYU pragma: keep #include // for fprintf, stderr #include // for strsignal #ifdef HAVE_CXXABI_H /* We use that to demangle C++ names */ #include // IWYU pragma: keep #endif #ifdef HAVE_GLIBC #include // for backtrace, backtrace_symbols #include // for signal, raise, SIGABRT, SIGSEGV #else #include "verbose.h" // verbose_output_print #endif #include "cado-sighandlers.h" #ifdef HAVE_GLIBC static void signal_handling (int signum)/*{{{*/ { fprintf (stderr, "*** Error: caught signal \"%s\"\n", strsignal (signum)); int sz = 100, i; void *buffer [sz]; char** text; sz = backtrace (buffer, sz); text = backtrace_symbols (buffer, sz); fprintf(stderr, "======= Backtrace: =========\n"); for (i = 0; i < sz; i++) fprintf (stderr, "%s\n", text [i]); signal (signum, SIG_DFL); raise (signum); }/*}}}*/ #endif void cado_sighandlers_install() { #ifdef HAVE_GLIBC signal (SIGABRT, signal_handling); signal (SIGSEGV, signal_handling); #else verbose_output_print(0, 0, "# Cannot catch signals in an interesting way, lack glibc support\n"); #endif }