From: mquinson Date: Sat, 7 Jul 2007 13:10:15 +0000 (+0000) Subject: Do only call addr2line on a library when we got the actual name of the library, natur... X-Git-Tag: v3.3~1687 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/9b954240096d6a5c28a1d92cabee46a8ebdea5e2?hp=b1ad3869f4a66c317ba550880d95efa5f4ec2e1e Do only call addr2line on a library when we got the actual name of the library, naturally. I dunno how to get this name when it's not explicited in /proc/self/maps (Ideas someone?) git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@3673 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/src/xbt/ex.c b/src/xbt/ex.c index 645acbaf0d..9b0c66b6f2 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -158,8 +158,9 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { offset = first; found=1; } - DEBUG4("%#lx %s [%#lx-%#lx]", - addr, found? "in":"out of",first,last); + if (found) { + DEBUG3("%#lx in [%#lx-%#lx]", addr, first,last); + DEBUG0("Symbol found, map lines not further displayed (even if looking for next ones)"); } fclose(maps); free(maps_name); @@ -182,26 +183,32 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { /* Got it. We have our new address. Let's get the library path and we are set */ p = xbt_strdup(backtrace[i]); - p2 = strrchr(p,'('); - if (p2) *p2= '\0'; - p2 = strrchr(p,' '); - if(p2) *p2= '\0'; + if (p[0]=='[') { + /* library path not displayed in the map file either... */ + free(p); + sprintf(line_func,"??"); + } else { + p2 = strrchr(p,'('); + 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]); - free(p); - VERB1("Fire a new command: '%s'",subcmd); - subpipe = popen(subcmd,"r"); - if (!subpipe) { - CRITICAL0("Cannot fork addr2line to display the backtrace"); - abort(); + /* Here we go, fire an addr2line up */ + subcmd = bprintf("%s -f -e %s %s",ADDR2LINE,p, addrs[i]); + free(p); + VERB1("Fire a new command: '%s'",subcmd); + subpipe = popen(subcmd,"r"); + if (!subpipe) { + CRITICAL0("Cannot fork addr2line to display the backtrace"); + abort(); + } + fgets(line_func,1024,subpipe); + line_func[strlen(line_func)-1]='\0'; + fgets(line_pos,1024,subpipe); + line_pos[strlen(line_pos)-1]='\0'; + pclose(subpipe); + free(subcmd); } - fgets(line_func,1024,subpipe); - line_func[strlen(line_func)-1]='\0'; - fgets(line_pos,1024,subpipe); - line_pos[strlen(line_pos)-1]='\0'; - pclose(subpipe); - free(subcmd); /* check whether the trick worked */ if (strcmp("??",line_func)) { @@ -210,7 +217,7 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e) { } 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]); + e->bt_strings[i] = bprintf("** In ?? at %s", backtrace[i]); } }