void _signal_handler(int signo) { Backtrace *trace; #ifdef COREDUMPER_ENABLED WriteCoreDump(core_file_name(g_test_context_current->m_core_dir, g_test_case_current->m_suite->m_name, g_test_case_current->m_name)); #endif trace = backtrace_create(3); log_error("Signal received while running a test", msg_tag_int("signal", signo), msg_tag_str("suite", g_test_case_current->m_suite->m_name), msg_tag_str("test", g_test_case_current->m_name), NULL); backtrace_dump_log(trace, " ", LOG_ERR); backtrace_unreference(trace); if (signo == SIGABRT) { _test_run_hooks(TEST_HOOK_SIGNAL_ABORT); g_test_case_current_result = TEST_ABORT; } else { _test_run_hooks(TEST_HOOK_SIGNAL_SEGFAULT); g_test_case_current_result = TEST_SEGFAULT; } setcontext(g_test_ucontext.uc_link); }
/** * Handle SIGSEGV/SIGILL signals raised by threads */ static void segv_handler(int signal) { backtrace_t *backtrace; DBG1(DBG_DMN, "thread %u received %d", thread_current_id(), signal); backtrace = backtrace_create(2); backtrace->log(backtrace, NULL, TRUE); backtrace->destroy(backtrace); DBG1(DBG_DMN, "killing ourself, received critical signal"); abort(); }