50 std::string blanks(
" \t");
53 s = symbols.find_first_of(blanks,s);
55 s = symbols.find_first_not_of(blanks,s+1);
56 e = symbols.find_first_of(blanks,s+1);
57 module = symbols.substr(s,e-s);
59 s = symbols.find_first_not_of(blanks,e+1);
60 e = symbols.find_first_of(blanks,s+1);
61 address = symbols.substr(s,e-s);
63 s = symbols.find_first_not_of(blanks,e+1);
64 e = symbols.find_first_of(blanks,s+1);
65 function = symbols.substr(s,e-s);
67 s = symbols.find_first_not_of(blanks,e+1);
68 e = symbols.find_first_of(blanks,s+1);
70 s = symbols.find_first_not_of(blanks,e+1);
71 e = symbols.find_first_of(blanks,s+1);
72 offset = symbols.substr(s,e-s);
77 e = symbols.find(
'(',s);
78 module = symbols.substr(s,e-s);
81 e = symbols.find(
'+',s+1);
82 function = symbols.substr(s+1,e-s-1);
85 e = symbols.find(
')',s+1);
86 offset = symbols.substr(s+1,e-s-1);
88 s = symbols.find(
'[',s+1);
89 e = symbols.find(
']',s+2);
90 address = symbols.substr(s+1,e-s-1);
97 os <<
" Stack trace:\n";
100 const size_t max_frames = 100;
101 void* addrlist[max_frames];
104 int addrlen = backtrace(addrlist,
sizeof(addrlist) /
sizeof(
void*));
107 os <<
"* <EMPTY BACKTRACE, POSSIBLY CORRUPT STACK.> *\n";
111 char** symbollist = backtrace_symbols(addrlist, addrlen);
114 size_t funcnamesize = 256;
115 char* funcname =
new char[funcnamesize];
119 for (
size_t i = 2; i < addrlen; i++)
122 string module,
function, address, offset;
125 if (! (module.empty() || address.empty() ||
function.empty() || offset.empty()) )
129 char* ret = abi::__cxa_demangle(
function.c_str(), NULL, 0, &status);
131 function.assign( ret );
133 os <<
" " << int(i-2) <<
" " << module.c_str() <<
" [" << address.c_str() <<
"]: "
134 <<
function.c_str() <<
" + " << offset.c_str() <<
"\n";
139 os <<
" " << int(i-2) <<
" " << module.c_str() <<
" [" << address.c_str() <<
"]: "
140 <<
function.c_str() <<
" + " << offset.c_str() <<
"\n";
146 os <<
" " << int(i-2) <<
" " << symbollist[i] <<
"\n";