diff --git a/maxscale-system-test/testconnections.cpp b/maxscale-system-test/testconnections.cpp index 9c75a67d6..73a997e77 100644 --- a/maxscale-system-test/testconnections.cpp +++ b/maxscale-system-test/testconnections.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include #include "mariadb_func.h" #include "maxadmin_operations.h" @@ -18,6 +20,28 @@ static std::string required_repl_version; static std::string required_galera_version; } +static int signal_set(int sig, void (*handler)(int)) +{ + struct sigaction sigact = {}; + sigact.sa_handler = handler; + + do + { + errno = 0; + sigaction(sig, &sigact, NULL); + } + while (errno == EINTR); +} + +void sigfatal_handler(int i) +{ + void *addrs[128]; + int count = backtrace(addrs, 128); + backtrace_symbols_fd(addrs, count, STDERR_FILENO); + signal_set(i, SIG_DFL); + raise(i); +} + void TestConnections::check_nodes(bool value) { maxscale::check_nodes = value; @@ -44,6 +68,14 @@ TestConnections::TestConnections(int argc, char *argv[]): global_result(0), binlog_cmd_option(0), enable_timeouts(true), use_ipv6(false), no_galera(false) { + signal_set(SIGSEGV, sigfatal_handler); + signal_set(SIGABRT, sigfatal_handler); + signal_set(SIGFPE, sigfatal_handler); + signal_set(SIGILL, sigfatal_handler); +#ifdef SIGBUS + signal_set(SIGBUS, sigfatal_handler); +#endif + chdir(test_dir); gettimeofday(&start_time, NULL); ports[0] = rwsplit_port;