Demangle stacktrace names.
git-svn-id: svn://localhost/ardour2/branches/3.0@7866 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
f561a6e2a4
commit
1c7f17dcc0
@ -33,6 +33,40 @@ PBD::trace_twb ()
|
|||||||
#ifdef HAVE_EXECINFO
|
#ifdef HAVE_EXECINFO
|
||||||
|
|
||||||
#include <execinfo.h>
|
#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
|
void
|
||||||
PBD::stacktrace (std::ostream& out, int levels)
|
PBD::stacktrace (std::ostream& out, int levels)
|
||||||
@ -47,10 +81,8 @@ PBD::stacktrace (std::ostream& out, int levels)
|
|||||||
|
|
||||||
if (strings) {
|
if (strings) {
|
||||||
|
|
||||||
printf ("Obtained %zd stack frames.\n", size);
|
|
||||||
|
|
||||||
for (i = 0; i < size && (levels == 0 || i < size_t(levels)); i++) {
|
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);
|
free (strings);
|
||||||
|
Loading…
Reference in New Issue
Block a user