X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/e9b99cc75875aaffe31d627aceb45a3583770d55..a78e55a602586cf557968132c2d8c30af758af25:/src/mc/explo/Exploration.cpp diff --git a/src/mc/explo/Exploration.cpp b/src/mc/explo/Exploration.cpp index 773438b3f3..1dbe4c41e3 100644 --- a/src/mc/explo/Exploration.cpp +++ b/src/mc/explo/Exploration.cpp @@ -5,7 +5,11 @@ #include "src/mc/explo/Exploration.hpp" #include "src/mc/mc_config.hpp" +#include "src/mc/mc_exit.hpp" #include "src/mc/mc_private.hpp" +#include "src/mc/sosp/RemoteProcessMemory.hpp" + +#include XBT_LOG_NEW_DEFAULT_SUBCATEGORY(mc_explo, mc, "Generic exploration algorithm of the model-checker"); @@ -14,9 +18,12 @@ namespace simgrid::mc { static simgrid::config::Flag cfg_dot_output_file{ "model-check/dot-output", "Name of dot output file corresponding to graph state", ""}; +Exploration* Exploration::instance_ = nullptr; // singleton instance + Exploration::Exploration(const std::vector& args) : remote_app_(std::make_unique(args)) { - mc_model_checker->set_exploration(this); + xbt_assert(instance_ == nullptr, "Cannot have more than one exploration instance"); + instance_ = this; if (not cfg_dot_output_file.get().empty()) { dot_output_ = fopen(cfg_dot_output_file.get().c_str(), "w"); @@ -31,6 +38,7 @@ Exploration::~Exploration() { if (dot_output_ != nullptr) fclose(dot_output_); + instance_ = nullptr; } void Exploration::dot_output(const char* fmt, ...) @@ -57,4 +65,53 @@ void Exploration::log_state() } } +void Exploration::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 (not xbt_log_no_loc) + XBT_INFO("%s core dump was generated by the system.", WCOREDUMP(status) ? "A" : "No"); + + XBT_INFO("Counter-example execution trace:"); + for (auto const& s : get_textual_trace()) + XBT_INFO(" %s", s.c_str()); + XBT_INFO("You can debug the problem (and see the whole details) by rerunning out of simgrid-mc with " + "--cfg=model-check/replay:'%s'", + get_record_trace().to_string().c_str()); + log_state(); + if (xbt_log_no_loc) { + XBT_INFO("Stack trace not displayed because you passed --log=no_loc"); + } else { + XBT_INFO("Stack trace:"); + get_remote_app().get_remote_process_memory().dump_stack(); + } + + system_exit(SIMGRID_MC_EXIT_PROGRAM_CRASH); +} +void Exploration::report_assertion_failure() +{ + XBT_INFO("**************************"); + XBT_INFO("*** PROPERTY NOT VALID ***"); + XBT_INFO("**************************"); + XBT_INFO("Counter-example execution trace:"); + for (auto const& s : get_textual_trace()) + XBT_INFO(" %s", s.c_str()); + XBT_INFO("You can debug the problem (and see the whole details) by rerunning out of simgrid-mc with " + "--cfg=model-check/replay:'%s'", + get_record_trace().to_string().c_str()); + log_state(); + system_exit(SIMGRID_MC_EXIT_SAFETY); +} + +void Exploration::system_exit(int status) +{ + get_remote_app().shutdown(); + ::exit(status); +} + }; // namespace simgrid::mc