From a3dc0324f0fd34a80919de8c343de96468992292 Mon Sep 17 00:00:00 2001 From: Brian Demsky Date: Fri, 24 Jan 2020 23:36:45 -0800 Subject: [PATCH] Add some debug support code --- model.cc | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/model.cc b/model.cc index d1e94e5e..5b5ccf70 100644 --- a/model.cc +++ b/model.cc @@ -26,6 +26,37 @@ void placeholder(void *) { ASSERT(0); } +#include + +#define SIGSTACKSIZE 65536 +static void mprot_handle_pf(int sig, siginfo_t *si, void *unused) +{ + model_print("Segmentation fault at %p\n", si->si_addr); + model_print("For debugging, place breakpoint at: %s:%d\n", + __FILE__, __LINE__); + print_trace(); // Trace printing may cause dynamic memory allocation + while(1) + ; +} + +void install_handler() { + stack_t ss; + ss.ss_sp = model_malloc(SIGSTACKSIZE); + ss.ss_size = SIGSTACKSIZE; + ss.ss_flags = 0; + sigaltstack(&ss, NULL); + struct sigaction sa; + sa.sa_flags = SA_SIGINFO | SA_NODEFER | SA_RESTART | SA_ONSTACK; + sigemptyset(&sa.sa_mask); + sa.sa_sigaction = mprot_handle_pf; + + if (sigaction(SIGSEGV, &sa, NULL) == -1) { + perror("sigaction(SIGSEGV)"); + exit(EXIT_FAILURE); + } + +} + /** @brief Constructor */ ModelChecker::ModelChecker() : /* Initialize default scheduler */ @@ -56,6 +87,7 @@ ModelChecker::ModelChecker() : /* Configure output redirection for the model-checker */ redirect_output(); install_trace_analyses(get_execution()); + install_handler(); } /** @brief Destructor */ -- 2.34.1