Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
When dealing with an uncatched exception, use CRITICAL after printf. Just in case...
[simgrid.git] / src / xbt / ex.c
index 9ec447f..075ab29 100644 (file)
@@ -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;
@@ -203,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; j<e->used; j++)
+        free(addrs[j]);
+       e->used = i+1;
+    }
+     
+    if (!strncmp("__context_wrapper",line_func,strlen("__context_wrapper"))) {
+       int j;
+       for (j=i+1; j<e->used; j++)
+        free(addrs[j]);
+       e->used = i;
+    }
+   
+    
   }
   pclose(pipe);
   free(addrs);
@@ -226,7 +247,6 @@ void xbt_ex_display(xbt_ex_t *e)  {
   if (e->remote)
     bprintf(" on host %s(%ld)",e->host,e->pid);
 
-  CRITICAL1("%s",e->msg);
   fprintf(stderr,
          "** SimGrid: UNCAUGHT EXCEPTION received on %s(%ld): category: %s; value: %d\n"
          "** %s\n"
@@ -234,6 +254,7 @@ void xbt_ex_display(xbt_ex_t *e)  {
          gras_os_myname(),gras_os_getpid(),
          xbt_ex_catname(e->category), e->value, e->msg,
          e->procname,thrower?thrower:" in this process");
+  CRITICAL1("%s",e->msg);
 
   if (thrower)
     free(thrower);
@@ -267,8 +288,8 @@ void __xbt_ex_terminate_default(xbt_ex_t *e)  {
 }
 
 /* the externally visible API */
-ex_ctx_cb_t XBT_DECLARE_DATA  __xbt_ex_ctx       = &__xbt_ex_ctx_default;
-ex_term_cb_t XBT_DECLARE_DATA __xbt_ex_terminate = &__xbt_ex_terminate_default;
+XBT_PUBLIC_DATA(ex_ctx_cb_t)  __xbt_ex_ctx       = &__xbt_ex_ctx_default;
+XBT_PUBLIC_DATA(ex_term_cb_t) __xbt_ex_terminate = &__xbt_ex_terminate_default;
 
 
 void xbt_ex_free(xbt_ex_t e) {
@@ -314,6 +335,7 @@ int backtrace (void **__array, int __size) {
 #endif
 
 #ifdef SIMGRID_TEST
+#include <stdio.h>
 #include "xbt/ex.h"
 
 XBT_TEST_SUITE("xbt_ex","Exception Handling");