Backtracks are usually returned from backtrace_symbols in the following format:
./MyApp (_ZN4test3fooEv + 0x8) [0x821c874]
abi :: __ cxa_demangle expects only the name of the function. Thus, you must first perform some analysis on the track:
std::string trace(backtrace[idx]);
{
std::string::size_type begin, end;
begin = trace.find_first_of('(') + 1;
end = trace.find_last_of('+');
if (begin != std::string::npos && end != std::string::npos) {
trace = trace.substr(begin, end - begin);
size_t maxName = 1024;
int demangleStatus;
char* demangledName = (char*) malloc(maxName);
if ((demangledName = abi::__cxa_demangle(trace.c_str(), demangledName, &maxName,
&demangleStatus)) && demangleStatus == 0) {
trace = demangledName;
}
free(demangledName);
}
}
, :
:: Foo()
, , , .