diff --git a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp index 5c4b811145..99a03205ef 100644 --- a/stepmania/src/archutils/Unix/CrashHandlerChild.cpp +++ b/stepmania/src/archutils/Unix/CrashHandlerChild.cpp @@ -150,6 +150,8 @@ void BacktraceNames::FromString( CString s ) } } #elif defined(BACKTRACE_LOOKUP_METHOD_ATOS) +#include + void BacktraceNames::FromAddr( void *p ) { int fds[2]; @@ -242,6 +244,36 @@ void BacktraceNames::FromAddr( void *p ) */ if (Symbol[0] == '_') Symbol = Symbol.substr(1); + + /* demangle the name using __cxa_demangle() if needed */ + if (Symbol.substr(0, 2) == "_Z") + { + const char *name; + int status = 0; + name = abi::__cxa_demangle(Symbol, 0, 0, &status); + if (name) + Symbol = name; + else + { + switch (status) + { + case 0: + fprintf(stderr, "WTF? It returned success...\n"); + break; + case -1: + fprintf(stderr, "Memory allocation failure.\n"); + break; + case -2: + fprintf(stderr, "Invalid mangled name: %s.\n", Symbol.c_str()); + break; + case -3: + fprintf(stderr, "Invalid arguments.\n"); + break; + default: + fprintf(stderr, "No idea what happened here."); + } + } + } /* eg, the full line: * __Z1Ci (in a.out) (asmtest.cc:33) * _main (in a.out) (asmtest.cc:52)