From 309fcd6d428b2f552fd27bf93154a09d5836eed4 Mon Sep 17 00:00:00 2001 From: Daniel Silverstone Date: Sat, 25 Apr 2020 21:04:41 +0100 Subject: monkey: Catch some signals and backtrace Signed-off-by: Daniel Silverstone --- frontends/monkey/main.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/frontends/monkey/main.c b/frontends/monkey/main.c index e4d32d807..3fd06960a 100644 --- a/frontends/monkey/main.c +++ b/frontends/monkey/main.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "utils/config.h" #include "utils/sys_time.h" @@ -340,6 +341,28 @@ __assert_fail(const char *__assertion, const char *__file, abort(); } + +static void +signal_handler(int sig) +{ + int frames; + fprintf(stderr, "Caught signal %s (%d)\n", + ((sig == SIGSEGV) ? "SIGSEGV" : + ((sig == SIGILL) ? "SIGILL" : + ((sig == SIGFPE) ? "SIGFPE" : + ((sig == SIGBUS) ? "SIGBUS" : + "unknown signal")))), + sig); + frames = backtrace(&backtrace_buffer[0], 4096); + if (frames > 0 && frames < 4096) { + fprintf(stderr, "Backtrace:\n"); + fflush(stderr); + backtrace_symbols_fd(&backtrace_buffer[0], frames, 2); + } + + abort(); +} + #endif int @@ -359,6 +382,15 @@ main(int argc, char **argv) .llcache = filesystem_llcache_table, }; +#if (!defined(NDEBUG) && defined(HAVE_EXECINFO)) + /* Catch segfault, illegal instructions and fp exceptions */ + signal(SIGSEGV, signal_handler); + signal(SIGILL, signal_handler); + signal(SIGFPE, signal_handler); + /* It's unlikely, but SIGBUS could happen on some platforms */ + signal(SIGBUS, signal_handler); +#endif + ret = netsurf_register(&monkey_table); if (ret != NSERROR_OK) { die("NetSurf operation table failed registration"); -- cgit v1.2.3