22 #ifdef GETFEM_HAVE_BACKTRACE
23 # include <execinfo.h>
25 #ifdef GETFEM_HAVE_CXXABI_H
34 #ifdef GETFEM_HAVE_CXXABI_H
35 std::string demangle(
const char *s) {
38 char *sd = abi::__cxa_demangle(s, NULL, NULL, &status);
39 if (sd == NULL || status) {
42 return std::string(
"");
50 std::string demangle(
const char *) {
return std::string(
""); }
53 #ifdef GETFEM_HAVE_BACKTRACE
54 void dump_glibc_backtrace() {
60 n = backtrace(trace, 256);
61 strings = backtrace_symbols (trace, n);
62 if (strings == NULL) {
63 fprintf(stderr,
"backtrace unavailable ... no more memory ?\n");
return;
65 fprintf(stderr,
"Backtrace dump follows:\n");
66 for (i = 0; i < n; ++i) {
67 char s[256]; strncpy(s,strings[i],256);s[255]=0;
68 char *a = strchr(s,
'('), *b = 0;
69 if (a) b = strchr(a,
'+');
71 fprintf(stderr,
"%2d : %s\n", i, s);
74 fprintf(stderr,
"%2d : %s(%s+%s %s\n",
75 i, s, a+1, b+1, demangle(a+1).c_str());
81 fprintf(stderr,
"ooops, a recursive bug in dump_glibc_backtrace\n");