X-Git-Url: http://bilbo.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/ee46aeb90cdb3bc07942faa11cdc058ff0fa59e8..d4c3a2a250606b6673da94589f91b73889112263:/src/xbt/ex.c diff --git a/src/xbt/ex.c b/src/xbt/ex.c index e1cc355b4f..d51f9904e5 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -86,7 +86,10 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { snprintf(buff,256,"%s",strchr(backtrace[i],'[')+1); p=strchr(buff,']'); *p='\0'; - addrs[i]=bprintf("%s", buff); + if (strcmp(buff,"(nil)")) + addrs[i]=bprintf("%s", buff); + else + addrs[i]=bprintf("0x0"); DEBUG3("Set up a new address: %d, '%s'(%p)", i, addrs[i], addrs[i]); /* Add it to the command line args */ @@ -112,8 +115,8 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { line_pos[strlen(line_pos)-1]='\0'; if (strcmp("??",line_func)) { - DEBUG2("Found static symbol %s() at %s", line_func, line_pos); - e->bt_strings[i] = bprintf("** In %s() at %s (static symbol)", line_func,line_pos); + DEBUG2("Found static symbol %s() at %s", line_func, line_pos); + e->bt_strings[i] = bprintf("** In %s() at %s", line_func,line_pos); } else { /* Damn. The symbol is in a dynamic library. Let's get wild */ char *maps_name; @@ -180,18 +183,9 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { are set */ p = xbt_strdup(backtrace[i]); p2 = strrchr(p,'('); - if (p2) { - *p2= '\0'; - } else { - p2 = strrchr(p,' '); - if(p2 == NULL) - { - ERROR1("Couldn't parse %s to get the library path", backtrace[i]); - xbt_abort(); - } - - *p2= '\0'; - } + if (p2) *p2= '\0'; + p2 = strrchr(p,' '); + if(p2) *p2= '\0'; /* Here we go, fire an addr2line up */ subcmd = bprintf("%s -f -e %s %s",ADDR2LINE,p, addrs[i]); @@ -212,14 +206,32 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { /* check whether the trick worked */ if (strcmp("??",line_func)) { DEBUG2("Found dynamic symbol %s() at %s", line_func, line_pos); - e->bt_strings[i] = bprintf("** In %s() at %s (dynamic symbol)", line_func,line_pos); + e->bt_strings[i] = bprintf("** In %s() at %s", line_func,line_pos); } else { /* damn, nothing to do here. Let's print the raw address */ DEBUG1("Dynamic symbol not found. Raw address = %s", backtrace[i]); e->bt_strings[i] = bprintf("** In ?? (%s)", backtrace[i]); } + } free(addrs[i]); + + /* Mask the bottom of the stack */ + if (!strncmp("main",line_func,strlen("main"))) { + int j; + for (j=i+1; jused; j++) + free(addrs[j]); + e->used = i+1; + } + + if (!strncmp("__context_wrapper",line_func,strlen("__context_wrapper"))) { + int j; + for (j=i+1; jused; j++) + free(addrs[j]); + e->used = i; + } + + } pclose(pipe); free(addrs); @@ -276,8 +288,9 @@ void __xbt_ex_terminate_default(xbt_ex_t *e) { } /* the externally visible API */ -ex_ctx_cb_t __xbt_ex_ctx = &__xbt_ex_ctx_default; -ex_term_cb_t __xbt_ex_terminate = &__xbt_ex_terminate_default; +ex_ctx_cb_t XBT_PUBLIC_DATA __xbt_ex_ctx = &__xbt_ex_ctx_default; +ex_term_cb_t XBT_PUBLIC_DATA __xbt_ex_terminate = &__xbt_ex_terminate_default; + void xbt_ex_free(xbt_ex_t e) { int i; @@ -322,6 +335,7 @@ int backtrace (void **__array, int __size) { #endif #ifdef SIMGRID_TEST +#include #include "xbt/ex.h" XBT_TEST_SUITE("xbt_ex","Exception Handling");