From: Gabriel Corona Date: Mon, 9 Nov 2015 14:45:08 +0000 (+0100) Subject: [mc] Generate a message showing the path on crash of the model-checked X-Git-Tag: v3_13~1582^2~12 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/3c19913ffaeae44ebfdaea24d987dcb5947edd1b?ds=sidebyside [mc] Generate a message showing the path on crash of the model-checked --- diff --git a/src/mc/mc_exit.h b/src/mc/mc_exit.h index 0b17cacad4..7889d720d7 100644 --- a/src/mc/mc_exit.h +++ b/src/mc/mc_exit.h @@ -7,6 +7,7 @@ #define SIMGRID_EXIT_DEADLOCK 3 #define SIMGRID_EXIT_NON_TERMINATION 4 #define SIMGRID_EXIT_NON_DETERMINISM 5 +#define SIMGRID_PROGRAM_CRASH 6 #define SIMGRID_ERROR 63 diff --git a/src/mc/mc_global.cpp b/src/mc/mc_global.cpp index 3fe3677bf9..68675a933f 100644 --- a/src/mc/mc_global.cpp +++ b/src/mc/mc_global.cpp @@ -585,6 +585,25 @@ void MC_report_assertion_error(void) MC_print_statistics(mc_stats); } +void MC_report_crash(int status) +{ + XBT_INFO("**************************"); + XBT_INFO("** CRASH IN THE PROGRAM **"); + XBT_INFO("**************************"); + if (WIFSIGNALED(status)) + XBT_INFO("From signal: %s", strsignal(WTERMSIG(status))); + else if (WIFEXITED(status)) + XBT_INFO("From exit: %i", WEXITSTATUS(status)); + if (WCOREDUMP(status)) + XBT_INFO("A core dump was generated by the system."); + else + XBT_INFO("No core dump was generated by the system."); + XBT_INFO("Counter-example execution trace:"); + MC_record_dump_path(mc_stack); + MC_dump_stack_safety(mc_stack); + MC_print_statistics(mc_stats); +} + void MC_invalidate_cache(void) { if (mc_model_checker) diff --git a/src/mc/mc_private.h b/src/mc/mc_private.h index b21b6a5cbf..c917c22acd 100644 --- a/src/mc/mc_private.h +++ b/src/mc/mc_private.h @@ -119,6 +119,7 @@ XBT_PRIVATE void print_comparison_times(void); XBT_PRIVATE void MC_dump_stacks(FILE* file); XBT_PRIVATE void MC_report_assertion_error(void); +XBT_PRIVATE void MC_report_crash(int status); XBT_PRIVATE void MC_invalidate_cache(void); diff --git a/src/mc/mc_server.cpp b/src/mc/mc_server.cpp index f552110627..92769072e3 100644 --- a/src/mc/mc_server.cpp +++ b/src/mc/mc_server.cpp @@ -81,6 +81,7 @@ void s_mc_server::start() // The model-checked process is ready, we can read its memory layout: MC_init_model_checker(pid, socket); + ptrace(PTRACE_SETOPTIONS, pid, nullptr, PTRACE_O_TRACEEXIT); ptrace(PTRACE_CONT, pid, 0, 0); } @@ -318,7 +319,25 @@ void s_mc_server::handle_waitpid() } if (pid == mc_model_checker->process().pid()) { - if (WIFEXITED(status) || WIFSIGNALED(status)) { + + // From PTRACE_O_TRACEEXIT: + if (status>>8 == (SIGTRAP | (PTRACE_EVENT_EXIT<<8))) { + if (ptrace(PTRACE_GETEVENTMSG, pid, 0, &status) == -1) + xbt_die("Could not get exit status"); + if (WIFSIGNALED(status)) { + MC_report_crash(status); + ::exit(SIMGRID_PROGRAM_CRASH); + } + } + + // We don't care about signals, just reinject them: + if (WIFSTOPPED(status)) { + XBT_DEBUG("Stopped with signal %i", (int) WSTOPSIG(status)); + if (ptrace(PTRACE_CONT, pid, 0, WSTOPSIG(status)) == -1) + xbt_die("Could not PTRACE_CONT"); + } + + else if (WIFEXITED(status) || WIFSIGNALED(status)) { XBT_DEBUG("Child process is over"); mc_model_checker->process().terminate(status); }