+/** \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");
+ XBT_CRITICAL("%s", e->msg);
+ xbt_free(thrower);
+
+ if (!e->remote && !e->bt_strings)
+ xbt_ex_setup_backtrace(e);
+
+#ifdef HAVE_BACKTRACE
+ if (e->used && e->bt_strings) {
+ /* We have everything to build neat backtraces */
+ int i;
+
+ fprintf(stderr, "\n");
+ for (i = 0; i < e->used; i++)
+ fprintf(stderr, "%s\n", e->bt_strings[i]);
+
+ } else
+#endif
+ {
+ fprintf(stderr,
+ "\n"
+ "** In %s() at %s:%d\n"
+ "** (no backtrace available)\n",
+ e->func, e->file, e->line);
+ }
+}
+