/** @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); 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->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); 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 */ } if (!e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE if (e->used && e->bt_strings) { /* We have everything to build neat backtraces */ int i; 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 = sg_cfg_get_boolean("exception/cutpath"); } CATCH_ANONYMOUS { } fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) { if (cutpath) { char* p = e->bt_strings[i]; 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 = malloc(length); memcpy(dest, &p[0], length); dest[length] = 0; fprintf(stderr, "%s %s\n", dest, filename); free(dest); } else { fprintf(stderr, "%s\n", e->bt_strings[i]); } } } else
/** @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); 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->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); xbt_free(thrower); if (!e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE if (e->used && e->bt_strings) { /* We have everything to build neat backtraces */ int i; fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) { if (sg_cfg_get_boolean("exception/cutpath")) { char* p = e->bt_strings[i]; 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 = malloc(length); memcpy(dest, &p[0], length); dest[length] = 0; fprintf(stderr, "%s %s\n", dest, filename); free(dest); } else { fprintf(stderr, "%s\n", e->bt_strings[i]); } } } else #endif { fprintf(stderr, "\n" "** In %s() at %s:%d\n" "** (no backtrace available)\n", e->func, e->file, e->line); } }
/** @brief shows an exception content and the associated stack if available */ void xbt_ex_display(xbt_ex_t * e) { char *thrower = NULL; if (e->remote) thrower = bprintf(" on host %s(%d)", e->host, e->pid); fprintf(stderr, "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n" "** %s\n" "** Thrown by %s()%s\n", gras_os_myname(), (*xbt_getpid) (), xbt_ex_catname(e->category), e->value, e->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); if (!e->remote && !e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE /* We have everything to build neat backtraces */ { int i; if (!xbt_binary_name) { fprintf(stderr, "variable 'xbt_binary_name' set to NULL. Cannot compute the backtrace\n"); return; } fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) fprintf(stderr, "%s\n", e->bt_strings[i]); } #else fprintf(stderr, " at %s:%d:%s (no backtrace available on that arch)\n", e->file, e->line, e->func); #endif }
/** @brief shows an exception content and the associated stack if available */ void xbt_ex_display(xbt_ex_t * e) { char *thrower = NULL; 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->msg, e->procname, thrower ? thrower : " in this process"); XBT_CRITICAL("%s", e->msg); xbt_free(thrower); if (!e->bt_strings) xbt_ex_setup_backtrace(e); #ifdef HAVE_BACKTRACE if (e->used && e->bt_strings) { /* We have everything to build neat backtraces */ int i; fprintf(stderr, "\n"); for (i = 0; i < e->used; i++) fprintf(stderr, "%s\n", e->bt_strings[i]); } else #endif { fprintf(stderr, "\n" "** In %s() at %s:%d\n" "** (no backtrace available)\n", e->func, e->file, e->line); } }