/** @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); } }
static int xbt_log_layout_simple_doit(xbt_log_layout_t l, xbt_log_event_t ev, const char *fmt) { char *p = ev->buffer; int rem_size = ev->buffer_size; const char *procname; int len; *p = '['; check_overflow(1); /* Display the proc info if available */ procname = xbt_procname(); if (procname && *procname) { len = snprintf(p, rem_size, "%s:%s:(%d) ", SIMIX_host_self_get_name(), procname, xbt_getpid()); check_overflow(len); } else if (!procname) { len = snprintf(p, rem_size, "%s::(%d) ", SIMIX_host_self_get_name(), xbt_getpid()); check_overflow(len); } /* Display the date */ len = snprintf(p, rem_size, "%f] ", surf_get_clock() - simple_begin_of_time); check_overflow(len); /* Display file position if not INFO */ if (ev->priority != xbt_log_priority_info && !xbt_log_no_loc) { len = snprintf(p, rem_size, "%s:%d: ", ev->fileName, ev->lineNum); check_overflow(len); } /* Display category name */ len = snprintf(p, rem_size, "[%s/%s] ", ev->cat->name, xbt_log_priority_names[ev->priority]); check_overflow(len); /* Display user-provided message */ len = vsnprintf(p, rem_size, fmt, ev->ap); check_overflow(len); /* End it */ *p = '\n'; check_overflow(1); *p = '\0'; return 1; }
/** @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); } }
static int xbt_log_layout_format_doit(xbt_log_layout_t l, xbt_log_event_t ev, const char *msg_fmt) { char *p = ev->buffer; int rem_size = ev->buffer_size; int precision = -1; int length = -1; char *q; for (q = l->data ; *q != '\0' ; q++) { if (*q == '%') { q++; handle_modifier: switch (*q) { case '\0': fprintf(stderr, "Layout format (%s) ending with %%\n", (char *)l->data); xbt_abort(); case '%': *p = '%'; check_overflow(1); break; case 'n': /* platform-dependant line separator; LOG4J compliant */ *p = '\n'; check_overflow(1); break; case 'e': /* plain space; SimGrid extension */ *p = ' '; check_overflow(1); break; case '.': /* precision specifier */ precision = strtol(q + 1, &q, 10); goto handle_modifier; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': /* length modifier */ length = strtol(q, &q, 10); goto handle_modifier; case 'c': /* category name; LOG4J compliant should accept a precision postfix to show the hierarchy */ show_string(ev->cat->name); break; case 'p': /* priority name; LOG4J compliant */ show_string(xbt_log_priority_names[ev->priority]); break; case 'h': /* host name; SimGrid extension */ show_string(SIMIX_host_self_get_name()); break; case 't': /* thread name; LOG4J compliant */ show_string(SIMIX_process_self_get_name()); break; case 'P': /* process name; SimGrid extension */ show_string(xbt_procname()); break; case 'i': /* process PID name; SimGrid extension */ show_int(xbt_getpid()); break; case 'F': /* file name; LOG4J compliant */ show_string(ev->fileName); break; case 'l': { /* location; LOG4J compliant */ int len, sz; set_sz_from_precision(); len = snprintf(p, sz, "%s:%d", ev->fileName, ev->lineNum); check_overflow(MIN(sz, len)); break; } case 'L': /* line number; LOG4J compliant */ show_int(ev->lineNum); break; case 'M': /* method (ie, function) name; LOG4J compliant */ show_string(ev->functionName); break; case 'b': /* backtrace; called %throwable in LOG4J */ case 'B': /* short backtrace; called %throwable{short} in LOG4J */ // TODO, backtrace #if 0 && HAVE_BACKTRACE && HAVE_EXECINFO_H && HAVE_POPEN && defined(ADDR2LINE) { xbt_ex_t e(""); e.used = backtrace((void **) e.bt, XBT_BACKTRACE_SIZE); e.bt_strings = NULL; xbt_ex_setup_backtrace(&e); if (*q == 'B') { show_string(e.bt_strings[1] + 8); } else { xbt_strbuff_t buff = xbt_strbuff_new(); int i; xbt_strbuff_append(buff, e.bt_strings[1] + 8); for (i = 2; i < e.used; i++) { xbt_strbuff_append(buff, "\n"); xbt_strbuff_append(buff, e.bt_strings[i] + 8); } show_string(buff->data); xbt_strbuff_free(buff); } } #else show_string("(no backtrace on this arch)"); #endif break; case 'd': /* date; LOG4J compliant */ show_double(surf_get_clock()); break; case 'r': /* application age; LOG4J compliant */ show_double(surf_get_clock() - format_begin_of_time); break; case 'm': { /* user-provided message; LOG4J compliant */ int len, sz; set_sz_from_precision(); len = vsnprintf(p, sz, msg_fmt, ev->ap); check_overflow(MIN(sz, len)); break; } default: fprintf(stderr, ERRMSG, *q, (char *)l->data); xbt_abort(); } } else { *p = *q; check_overflow(1); } } *p = '\0'; return 1; }