X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Fstacktrace.cc;h=dd5e1fd3b643b8ee2a2f7d07192d6c82e3a92cfa;hb=a3583c89b20160de154d05ff4c3e2f2bd0ff44df;hp=c517967fa22f5a1253cfe9368af78f0d4f66eb29;hpb=70b939da4f9d4097160e32f2373a7a5ff8f4957f;p=ardour.git diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index c517967fa2..dd5e1fd3b6 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -17,7 +17,10 @@ */ -#include +#include "libpbd-config.h" + +#include "pbd/stacktrace.h" +#include #include void @@ -30,6 +33,40 @@ PBD::trace_twb () #ifdef HAVE_EXECINFO #include +#include + +std::string demangle (std::string const & l) +{ + std::string::size_type const b = l.find_first_of ("("); + if (b == std::string::npos) { + return l; + } + + std::string::size_type const p = l.find_last_of ("+"); + if (p == std::string::npos) { + return l; + } + + if ((p - b) <= 1) { + return l; + } + + std::string const fn = l.substr (b + 1, p - b - 1); + + int status; + try { + + char* realname = abi::__cxa_demangle (fn.c_str(), 0, 0, &status); + std::string d (realname); + free (realname); + return d; + + } catch (std::exception) { + + } + + return l; +} void PBD::stacktrace (std::ostream& out, int levels) @@ -44,10 +81,8 @@ PBD::stacktrace (std::ostream& out, int levels) if (strings) { - printf ("Obtained %zd stack frames.\n", size); - for (i = 0; i < size && (levels == 0 || i < size_t(levels)); i++) { - out << strings[i] << std::endl; + out << " " << demangle (strings[i]) << std::endl; } free (strings); @@ -57,7 +92,7 @@ PBD::stacktrace (std::ostream& out, int levels) #else void -PBD::stacktrace (std::ostream& out, int levels) +PBD::stacktrace (std::ostream& out, int /*levels*/) { out << "stack tracing is not enabled on this platform" << std::endl; }