+ 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);
+}
+
+#if defined(HAVE_EXECINFO_H) && defined(HAVE_POPEN) && defined(ADDR2LINE)
+# include "backtrace_linux.c"
+#elif (defined(_XBT_WIN32) && defined (_M_IX86)) && !defined(__GNUC__)
+# include "backtrace_windows.c"
+#else
+# include "backtrace_dummy.c"
+#endif
+
+/** @brief shows an exception content and the associated stack if available */
+void xbt_ex_display(xbt_ex_t * e)
+{
+ char *thrower = NULL;
+
+ if (e->remote)
+ thrower = bprintf(" on host %s(%d)", e->host, e->pid);
+
+ fprintf(stderr,
+ "** SimGrid: UNCAUGHT EXCEPTION received on %s(%d): category: %s; value: %d\n"
+ "** %s\n"
+ "** Thrown by %s()%s\n",
+ gras_os_myname(), (*xbt_getpid) (),
+ xbt_ex_catname(e->category), e->value, e->msg,
+ e->procname, thrower ? thrower : " in this process");
+ CRITICAL1("%s", e->msg);
+
+ if (!e->remote && !e->bt_strings)
+ xbt_ex_setup_backtrace(e);
+
+#ifdef HAVE_BACKTRACE
+ /* We have everything to build neat backtraces */
+ {
+ int i;
+
+ if (!xbt_binary_name) {
+ fprintf(stderr, "variable 'xbt_binary_name' set to NULL. Cannot compute the backtrace\n");
+ return;
+ }
+ fprintf(stderr, "\n");
+ for (i = 0; i < e->used; i++)
+ fprintf(stderr, "%s\n", e->bt_strings[i]);
+
+ }
+#else
+ fprintf(stderr, " at %s:%d:%s (no backtrace available on that arch)\n",
+ e->file, e->line, e->func);