17 #ifndef USGOV_49d1d337b2a0fc5c7d3988c513a828859517ba9520f1dbc3182719bf4ee878d6
18 #define USGOV_49d1d337b2a0fc5c7d3988c513a828859517ba9520f1dbc3182719bf4ee878d6
25 #if defined(__GLIBC__)
32 static inline void print_stacktrace_release(std::ostream& out,
unsigned int max_frames = 10) {
33 out <<
"stack trace:" << std::endl;
36 void* addrlist[max_frames+1];
39 int addrlen = backtrace(addrlist,
sizeof(addrlist) /
sizeof(
void*));
42 out <<
" <empty, possibly corrupt>" << std::endl;
48 char** symbollist = backtrace_symbols(addrlist, addrlen);
51 size_t funcnamesize = 256;
52 char* funcname = (
char*)malloc(funcnamesize);
56 for (
int i = 1; i < addrlen; i++) {
57 char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
61 for (
char *p = symbollist[i]; *p; ++p)
67 else if (*p ==
')' && begin_offset) {
73 if (begin_name && begin_offset && end_offset && begin_name < begin_offset) {
75 *begin_offset++ =
'\0';
78 char* ret = abi::__cxa_demangle(begin_name, funcname, &funcnamesize, &status);
81 out <<
" " << symbollist[i] <<
" : " << funcname <<
"+" << begin_offset << std::endl;
84 out <<
" " << symbollist[i] <<
" : " << begin_name <<
"()+" << begin_offset << std::endl;
88 out <<
" " << symbollist[i] << std::endl;
97 static inline void print_stacktrace(std::ostream& out,
unsigned int max_frames = 10) {
98 print_stacktrace_release(out, max_frames);
101 #define print_stacktrace (void)sizeof
104 #define print_stacktrace (void)sizeof