X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fsig-monitor.c;h=fbc5b1fb503dc918cb0517669394bf6a16205238;hb=170aef20bc3a59d5139c2eff8794d9ba4c83a2e5;hp=ce0a4cd028256ec87cd3ab6aa4e02c8ca1ba8d6e;hpb=8abd9262e343aec71e07388bdf829d4f76d6529e;p=src%2Fapp-framework-binder.git diff --git a/src/sig-monitor.c b/src/sig-monitor.c index ce0a4cd0..fbc5b1fb 100644 --- a/src/sig-monitor.c +++ b/src/sig-monitor.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "sig-monitor.h" #include "verbose.h" @@ -37,6 +38,26 @@ static _Thread_local sigjmp_buf *error_handler; static _Thread_local int thread_timer_set; static _Thread_local timer_t thread_timerid; +/* + * Dumps the current stack + */ +static void dumpstack(int crop) +{ + int idx, count; + void *addresses[1000]; + char **locations; + + count = backtrace(addresses, sizeof addresses / sizeof *addresses); + locations = backtrace_symbols(addresses, count); + if (locations == NULL) + ERROR("can't get the backtrace (returned %d addresses)", count); + else { + for (idx = crop; idx < count; idx++) + ERROR("[BACKTRACE %d/%d] %s", idx - crop + 1, count - crop, locations[idx]); + free(locations); + } +} + /* * Creates a timer for the current thread * @@ -109,6 +130,8 @@ static inline void timeout_delete() static void on_signal_terminate (int signum) { ERROR("Terminating signal %d received: %s", signum, strsignal(signum)); + if (signum == SIGABRT) + dumpstack(3); exit(1); } @@ -118,6 +141,10 @@ static void on_signal_error(int signum) sigset_t sigset; ERROR("ALERT! signal %d received: %s", signum, strsignal(signum)); + if (error_handler == NULL && signum == SIG_FOR_TIMER) + return; + + dumpstack(3); // unlock signal to allow a new signal to come if (error_handler != NULL) { @@ -126,8 +153,6 @@ static void on_signal_error(int signum) sigprocmask(SIG_UNBLOCK, &sigset, 0); longjmp(*error_handler, signum); } - if (signum == SIG_FOR_TIMER) - return; ERROR("Unmonitored signal %d received: %s", signum, strsignal(signum)); exit(2); } @@ -148,8 +173,8 @@ static int install(void (*handler)(int), int *signals) int sig_monitor_init() { - static int sigerr[] = { SIG_FOR_TIMER, SIGSEGV, SIGFPE, 0 }; - static int sigterm[] = { SIGINT, SIGABRT, 0 }; + static int sigerr[] = { SIG_FOR_TIMER, SIGSEGV, SIGFPE, SIGILL, SIGBUS, 0 }; + static int sigterm[] = { SIGINT, SIGABRT, SIGTERM, 0 }; return (install(on_signal_error, sigerr) & install(on_signal_terminate, sigterm)) - 1; } @@ -187,6 +212,3 @@ void sig_monitor(int timeout, void (*function)(int sig, void*), void *arg) } - - -