From: mquinson Date: Fri, 7 Apr 2006 15:43:43 +0000 (+0000) Subject: Display some info about the frames addr2line knows nothing about, and catchup with... X-Git-Tag: v3.3~3246 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/c3eaaf1a8869a1d2fb0364b7dc68e8b6d42ffec1 Display some info about the frames addr2line knows nothing about, and catchup with the lastest API breakage git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@2112 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/xbt/ex.c b/src/xbt/ex.c index f1da30ce83..7c4b18fa1a 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -87,8 +87,16 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { line_func[strlen(line_func)-1]='\0'; fgets(line_pos,1024,pipe); line_pos[strlen(line_pos)-1]='\0'; - - e->bt_strings[i] = bprintf("** At %s: %s (%s)", addrs[i], line_func,line_pos); + + if (strcmp("??",line_func)) { + e->bt_strings[i] = bprintf("** At %s: %s (%s)", addrs[i], line_func,line_pos); + } else { + char *p=bprintf("%s",backtrace[i]); + char *pos=strrchr(p,' '); + *pos = '\0'; + e->bt_strings[i] = bprintf("** At %s: ?? (%s)", addrs[i], p); + free(p); + } free(addrs[i]); } free(addrs); @@ -125,7 +133,7 @@ void xbt_ex_display(xbt_ex_t *e) { fprintf(stderr," at %s:%d:%s (no backtrace available on that arch)\n", e->file,e->line,e->func); #endif - xbt_ex_free(*e); + xbt_ex_free(e); } @@ -140,22 +148,23 @@ void __xbt_ex_terminate_default(xbt_ex_t *e) { ex_ctx_cb_t __xbt_ex_ctx = &__xbt_ex_ctx_default; ex_term_cb_t __xbt_ex_terminate = &__xbt_ex_terminate_default; -void xbt_ex_free(xbt_ex_t e) { +void xbt_ex_free(xbt_ex_t *e) { int i; - if (e.msg) free(e.msg); - free(e.procname); - if (e.remote) { - free(e.file); - free(e.func); - free(e.host); + if (e->msg) free(e->msg); + free(e->procname); + if (e->remote) { + free(e->file); + free(e->func); + free(e->host); } - /* locally, only one chunk of memory is allocated by the libc */ - if (e.bt_strings) { - for (i=0; ibt_strings) { + for (i=0; iused; i++) + free(e->bt_strings[i]); + free(e->bt_strings); + e->bt_strings = NULL; } + } /** \brief returns a short name for the given exception category */ @@ -213,7 +222,7 @@ XBT_TEST_UNIT("controlflow",test_controlflow, "basic nested control flow") { if (n != 4) xbt_test_fail1("M4: n=%d (!= 4)", n); n++; - xbt_ex_free(ex); + xbt_ex_free(&ex); } if (n != 5) xbt_test_fail1("M5: n=%d (!= 5)", n); @@ -232,7 +241,7 @@ XBT_TEST_UNIT("value",test_value,"exception value passing") { xbt_test_fail1("value=%d (!= 2)", ex.value); if (strcmp(ex.msg,"toto")) xbt_test_fail1("message=%s (!= toto)", ex.msg); - xbt_ex_free(ex); + xbt_ex_free(&ex); } } @@ -255,7 +264,7 @@ XBT_TEST_UNIT("variables",test_variables,"variable value preservation") { /* r2 is allowed to be destroyed because not volatile */ if (v2 != 5678) xbt_test_fail1("v2=%d (!= 5678)", v2); - xbt_ex_free(ex); + xbt_ex_free(&ex); } } @@ -280,7 +289,7 @@ XBT_TEST_UNIT("cleanup",test_cleanup,"cleanup handling") { xbt_test_fail1("v1 = %d (!= 5678)", v1); if (!(ex.category == 1 && ex.value == 2 && !strcmp(ex.msg,"blah"))) xbt_test_fail0("unexpected exception contents"); - xbt_ex_free(ex); + xbt_ex_free(&ex); } if (!c) xbt_test_fail0("xbt_ex_free not executed");