/* 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 <rse@engelschall.com> */
/* Copyright (c) 2002-2004 The OSSP Project <http://www.ossp.org/> */
/* Copyright (c) 2002-2004 Cable & Wireless <http://www.cw.com/> */
#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;
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; i<e.used; i++) /* no need to display "xbt_display_backtrace" */
- fprintf(stderr,"%s\n",e.bt_strings[i]);
+void xbt_backtrace_display(xbt_ex_t *e) {
+#if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
+ int i;
- e.msg=NULL;
- e.remote=0;
- xbt_ex_free(e);
+ if (e->used == 0) {
+ fprintf(stderr,"(backtrace not set)\n");
+ } else {
+ fprintf(stderr,"Backtrace:\n");
+ for (i=1; i<e->used; 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) {
/* $Id$ */
/* ex -- exception handling */
-/* This file is not to be loaded from anywhere but ex.c */
+/* This file is to loaded in any location defining exception handlers */
+/* (such as context.c) or in gras transport layer, to exchange them. */
-/* Copyright (c) 2003, 2004 Martin Quinson. All rights reserved. */
+/* Copyright (c) 2003, 2004, 2007 Martin Quinson. 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. */
#ifndef _XBT_EX_INTERFACE_H_
#define _XBT_EX_INTERFACE_H_
+#include "xbt/ex.h"
+/* The display made by an uncatched exception */
+void xbt_ex_display(xbt_ex_t *e);
+
+/* Change raw libc symbols to file names and line numbers */
void xbt_ex_setup_backtrace(xbt_ex_t *e);
#endif /* _XBT_EX_INTERFACE_H_ */