X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/f7c38a5c54c0ec04663ee41183bf583edea6c856..49ef939d12ab79d1e4b3ce1194ef89c8d6cafe5f:/src/xbt/ex.c diff --git a/src/xbt/ex.c b/src/xbt/ex.c index cfd8991891..c2e2e59933 100644 --- a/src/xbt/ex.c +++ b/src/xbt/ex.c @@ -2,7 +2,7 @@ /* ex - Exception Handling (modified to fit into SimGrid from OSSP version) */ -/* Copyright (c) 2005-2006 Martin Quinson */ +/* Copyright (c) 2005, 2006, 2007 Martin Quinson */ /* Copyright (c) 2002-2004 Ralf S. Engelschall */ /* Copyright (c) 2002-2004 The OSSP Project */ /* Copyright (c) 2002-2004 Cable & Wireless */ @@ -17,13 +17,12 @@ #include "portable.h" /* execinfo when available */ #include "xbt/ex.h" #include "xbt/module.h" /* xbt_binary_name */ -#include "xbt/ex_interface.h" #include "gras/Virtu/virtu_interface.h" /* gras_os_myname */ +#include "xbt/ex_interface.h" XBT_LOG_NEW_DEFAULT_SUBCATEGORY(xbt_ex,xbt,"Exception mecanism"); - /* default __ex_ctx callback function */ ex_ctx_t *__xbt_ex_ctx_default(void) { static ex_ctx_t ctx = XBT_CTX_INITIALIZER; @@ -31,27 +30,45 @@ ex_ctx_t *__xbt_ex_ctx_default(void) { return &ctx; } +/* Change raw libc symbols to file names and line numbers */ +void xbt_ex_setup_backtrace(xbt_ex_t *e); -/** \brief show the backtrace of the current point (lovely while debuging) */ -void xbt_backtrace_display(void) { +void xbt_backtrace_current(xbt_ex_t *e) { #if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE) - xbt_ex_t e; - int i; + e->used = backtrace((void**)e->bt,XBT_BACKTRACE_SIZE); + e->bt_strings = NULL; + xbt_ex_setup_backtrace(e); +#endif +} - e.used = backtrace((void**)e.bt,XBT_BACKTRACE_SIZE); - e.bt_strings = NULL; - xbt_ex_setup_backtrace(&e); - for (i=1; iused == 0) { + fprintf(stderr,"(backtrace not set)\n"); + } else { + fprintf(stderr,"Backtrace:\n"); + for (i=1; iused; i++) /* no need to display "xbt_display_backtrace" */ + fprintf(stderr,"---> %s\n",e->bt_strings[i] +4); + } + + /* don't fool xbt_ex_free with uninitialized msg field */ + e->msg=NULL; + e->remote=0; + xbt_ex_free(*e); #else ERROR0("No backtrace on this arch"); #endif } +/** \brief show the backtrace of the current point (lovely while debuging) */ +void xbt_backtrace_display_current(void) { + xbt_ex_t e; + xbt_backtrace_current(&e); + xbt_backtrace_display(&e); +} + extern char **environ; /* the environment, as specified by the opengroup */ void xbt_ex_setup_backtrace(xbt_ex_t *e) {