mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-08 07:45:00 +01:00
adjust demangling code a bit so that it can easily be used with typenames and not just functions in stacktraces
This commit is contained in:
parent
19bd641915
commit
7db5d68cdb
2 changed files with 26 additions and 17 deletions
|
|
@ -37,6 +37,7 @@
|
||||||
namespace PBD {
|
namespace PBD {
|
||||||
void stacktrace (std::ostream& out, int levels = 0);
|
void stacktrace (std::ostream& out, int levels = 0);
|
||||||
void trace_twb();
|
void trace_twb();
|
||||||
|
std::string demangle (const std::string&);
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
class thing_with_backtrace
|
class thing_with_backtrace
|
||||||
|
|
|
||||||
|
|
@ -35,37 +35,45 @@ PBD::trace_twb ()
|
||||||
#include <execinfo.h>
|
#include <execinfo.h>
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
|
|
||||||
std::string demangle (std::string const & l)
|
static std::string
|
||||||
|
symbol_demangle (const std::string& l)
|
||||||
|
{
|
||||||
|
int status;
|
||||||
|
|
||||||
|
try {
|
||||||
|
|
||||||
|
char* realname = abi::__cxa_demangle (l.c_str(), 0, 0, &status);
|
||||||
|
std::string d (realname);
|
||||||
|
free (realname);
|
||||||
|
return d;
|
||||||
|
} catch (std::exception) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string
|
||||||
|
PBD::demangle (std::string const & l)
|
||||||
{
|
{
|
||||||
std::string::size_type const b = l.find_first_of ("(");
|
std::string::size_type const b = l.find_first_of ("(");
|
||||||
|
|
||||||
if (b == std::string::npos) {
|
if (b == std::string::npos) {
|
||||||
return l;
|
return symbol_demangle (l);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string::size_type const p = l.find_last_of ("+");
|
std::string::size_type const p = l.find_last_of ("+");
|
||||||
if (p == std::string::npos) {
|
if (p == std::string::npos) {
|
||||||
return l;
|
return symbol_demangle (l);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p - b) <= 1) {
|
if ((p - b) <= 1) {
|
||||||
return l;
|
return symbol_demangle (l);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string const fn = l.substr (b + 1, p - b - 1);
|
std::string const fn = l.substr (b + 1, p - b - 1);
|
||||||
|
|
||||||
int status;
|
return symbol_demangle (fn);
|
||||||
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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue