X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/528fa2ce6be027b5428d122666ffc37706155449..6d1fc1c31cb2152b6d20742081118524dbb78d14:/src/xbt/ex.cpp diff --git a/src/xbt/ex.cpp b/src/xbt/ex.cpp index 2fd2e3b2a2..b0f5564aa7 100644 --- a/src/xbt/ex.cpp +++ b/src/xbt/ex.cpp @@ -1,7 +1,6 @@ /* ex - Exception Handling */ -/* Copyright (c) 2005-2015. The SimGrid Team. - * All rights reserved. */ +/* Copyright (c) 2005-2017. The SimGrid Team. All rights reserved. */ /* Copyright (c) 2002-2004 Ralf S. Engelschall */ /* Copyright (c) 2002-2004 The OSSP Project */ @@ -45,120 +44,34 @@ #include #include +#include #include "src/internal_config.h" /* execinfo when available */ #include "xbt/ex.h" +#include +#include "xbt/log.h" +#include "xbt/log.hpp" #include "xbt/backtrace.h" +#include "xbt/backtrace.hpp" #include "xbt/str.h" -#include "xbt/synchro_core.h" #include "src/xbt_modinter.h" /* backtrace initialization headers */ -#include "src/xbt/ex_interface.h" #include "simgrid/sg_config.h" /* Configuration mechanism of SimGrid */ -#include "simgrid/simix.h" /* SIMIX_process_self_get_name() */ - XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex, xbt, "Exception mechanism"); -xbt_ex::~xbt_ex() {} - -/* Change raw libc symbols to file names and line numbers */ -void xbt_setup_backtrace(xbt_backtrace_location_t** loc, std::size_t count, - char** res); - -void xbt_backtrace_display(xbt_backtrace_location_t* loc, std::size_t count) +void _xbt_throw(char* message, xbt_errcat_t errcat, int value, const char* file, int line, const char* func) { -#ifdef HAVE_BACKTRACE - std::vector backtrace = - simgrid::xbt::resolveBacktrace(loc, count); - if (backtrace.empty()) { - fprintf(stderr, "(backtrace not set)\n"); - return; - } - fprintf(stderr, "Backtrace (displayed in process %s):\n", SIMIX_process_self_get_name()); - for (std::string const& s : backtrace) - fprintf(stderr, "---> %s\n", s.c_str()); -#else - XBT_ERROR("No backtrace on this arch"); -#endif -} - -void xbt_throw( - char* message, xbt_errcat_t errcat, int value, - const char* file, int line, const char* func) -{ - xbt_ex e(message); + xbt_ex e(simgrid::xbt::ThrowPoint(file, line, func), message); free(message); e.category = errcat; e.value = value; - e.file = file; - e.line = line; - e.func = func; - e.procname = xbt_procname(); - e.pid = xbt_getpid(); throw e; } /** @brief shows an exception content and the associated stack if available */ void xbt_ex_display(xbt_ex_t * e) { - char *thrower = NULL; - if (e->pid != xbt_getpid()) - thrower = bprintf(" on process %d",e->pid); - - std::fprintf(stderr, "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n" - "** %s\n" - "** Thrown by %s()%s\n", - xbt_binary_name, xbt_getpid(), xbt_ex_catname(e->category), e->value, e->what(), - e->procname.c_str(), thrower ? thrower : " in this process"); - XBT_CRITICAL("%s", e->what()); - xbt_free(thrower); - - if (xbt_initialized==0 || smx_cleaned) { - fprintf(stderr, "Ouch. SimGrid is not initialized yet, or already closing. No backtrace available.\n"); - return; /* Not started yet or already closing. Trying to generate a backtrace would probably fail */ - } - - std::vector backtrace = simgrid::xbt::resolveBacktrace( - e->bt.data(), e->bt.size()); - -#ifdef HAVE_BACKTRACE - if (!backtrace.empty()) { - /* We have everything to build neat backtraces */ - int cutpath = 0; - try { // We don't want to have an exception while checking how to deal with the one we already have, do we? - cutpath = xbt_cfg_get_boolean("exception/cutpath"); - } - catch(xbt_ex& e) { - // Nothing to do - } - - std::fprintf(stderr, "\n"); - for (std::string const& s : backtrace) { - - // TODO, move this logic into solveBacktrace - if (cutpath) { - // TODO, simplify this - char* p = xbt_strdup(s.c_str()); - xbt_str_rtrim(p, ":0123456789"); - char* filename = strrchr(p, '/')+1; - char* end_of_message = strrchr(p, ' '); - int length = strlen(p)-strlen(end_of_message); - char* dest = (char*) std::malloc(length); - std::memcpy(dest, &p[0], length); - dest[length] = 0; - std::fprintf(stderr, "%s %s\n", dest, filename); - std::free(dest); - std::free(p); - } - else { - std::fprintf(stderr, "%s\n", s.c_str()); - } - } - } else -#endif - std::fprintf(stderr, "\n" - "** In %s() at %s:%d\n" - "** (no backtrace available)\n", e->func, e->file, e->line); + simgrid::xbt::logException(xbt_log_priority_critical, "UNCAUGHT EXCEPTION", *e); } /** \brief returns a short name for the given exception category */ @@ -193,6 +106,8 @@ const char *xbt_ex_catname(xbt_errcat_t cat) return "io error"; case vm_error: return "vm error"; + default: + return "INVALID ERROR"; } return "INVALID ERROR"; } @@ -200,6 +115,7 @@ const char *xbt_ex_catname(xbt_errcat_t cat) #ifdef SIMGRID_TEST #include #include "xbt/ex.h" +#include XBT_TEST_SUITE("xbt_ex", "Exception Handling");