summaryrefslogtreecommitdiff
path: root/libs/pbd/stacktrace.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-10-02 00:06:01 +0000
committerCarl Hetherington <carl@carlh.net>2010-10-02 00:06:01 +0000
commit1c7f17dcc0538210e9cbcfc64822b0bb4af19c7b (patch)
treeec89c679fda00a3ec121667c7c88fce04d429685 /libs/pbd/stacktrace.cc
parentf561a6e2a4b05c8c8439f3c125f3b16b6b6bc188 (diff)
Demangle stacktrace names.
git-svn-id: svn://localhost/ardour2/branches/3.0@7866 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd/stacktrace.cc')
-rw-r--r--libs/pbd/stacktrace.cc38
1 files changed, 35 insertions, 3 deletions
diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc
index 3aef2edd0b..dd5e1fd3b6 100644
--- a/libs/pbd/stacktrace.cc
+++ b/libs/pbd/stacktrace.cc
@@ -33,6 +33,40 @@ PBD::trace_twb ()
#ifdef HAVE_EXECINFO
#include <execinfo.h>
+#include <cxxabi.h>
+
+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)
@@ -47,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);