Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Some new functions to this. Bloatware, here we come.
[simgrid.git] / src / xbt / ex.c
index c7c2161..f5a7969 100644 (file)
@@ -1,33 +1,15 @@
-/*
-**  OSSP ex - Exception Handling (modified to fit into SimGrid)
-**  Copyright (c) 2005 Martin Quinson
-**  Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com>
-**  Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/>
-**  Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/>
-**
-**  This file is part of OSSP ex, an exception handling library
-**  which can be found at http://www.ossp.org/pkg/lib/ex/.
-**
-**  Permission to use, copy, modify, and distribute this software for
-**  any purpose with or without fee is hereby granted, provided that
-**  the above copyright notice and this permission notice appear in all
-**  copies.
-**
-**  THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
-**  WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-**  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-**  IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
-**  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-**  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-**  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
-**  USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
-**  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-**  OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
-**  OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-**  SUCH DAMAGE.
-**
-**  ex.c: exception handling (compiler part)
-*/
+/* $Id$ */
+
+/* ex - Exception Handling (modified to fit into SimGrid from OSSP version) */
+
+/*  Copyright (c) 2005-2006 Martin Quinson                                  */
+/*  Copyright (c) 2002-2004 Ralf S. Engelschall <rse@engelschall.com>       */
+/*  Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/>         */
+/*  Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/>           */
+/*  All rights reserved.                                                    */
+
+/* This program is free software; you can redistribute it and/or modify it
+ * under the terms of the license (GNU LGPL) which comes with this package. */
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -66,7 +48,7 @@ void xbt_backtrace_display(void) {
   e.remote=0;
   xbt_ex_free(e);
 #else 
-  fprintf(stderr,"No backtrace on this arch");
+  ERROR0("No backtrace on this arch");
 #endif
 }
 
@@ -127,7 +109,7 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e)  {
       FILE *maps;
       char maps_buff[512];
 
-      long int addr,offset;
+      long int addr,offset=0;
       char *p,*p2;
 
       char *subcmd;
@@ -165,12 +147,15 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e)  {
        DEBUG4("%#lx %s [%#lx-%#lx]",
               addr, found? "in":"out of",first,last);
       }
-      if (!found) 
-       CRITICAL0("Problem while reading the maps file");
-
       fclose(maps);
       free(maps_name);
 
+      if (!found) {
+       WARN0("Problem while reading the maps file");
+       e->bt_strings[i] = bprintf("**   In ?? (%s)", backtrace[i]);
+       continue;
+      }
+
       /* Ok, Found the offset of the maps line containing the searched symbol. 
         We now need to substract this from the address we got from backtrace.
       */
@@ -205,7 +190,7 @@ void xbt_ex_setup_backtrace(xbt_ex_t *e)  {
 
       /* check whether the trick worked */
       if (strcmp("??",line_func)) {
-       e->bt_strings[i] = bprintf("**   In %s() in %s (dynamic symbol)", line_func,line_pos);
+       e->bt_strings[i] = bprintf("**   In %s() at %s (dynamic symbol)", line_func,line_pos);
       } else {
        /* damn, nothing to do here. Let's print the raw address */
        e->bt_strings[i] = bprintf("**   In ?? (%s)", backtrace[i]);
@@ -227,10 +212,11 @@ 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"
-         "** Thrown by %s()%s",
+         "** Thrown by %s()%s\n",
          gras_os_myname(),gras_os_getpid(),
          xbt_ex_catname(e->category), e->value, e->msg,
          e->procname,thrower?thrower:" in this process");