XF65ACXZAPMLFX3BK5C4UKFBXZVMPOLP3SW5DVCUKEBTVCVT6FAAC
backtrace_t backtrace;
backtrace_symbols_t backtrace_symbols;
backtrace = nasty_cast<backtrace_t, void*>(dlsym(RTLD_DEFAULT, "backtrace"));
backtrace_symbols = nasty_cast<backtrace_symbols_t, void*>(dlsym(RTLD_DEFAULT, "backtrace_symbols"));
if (!backtrace || !backtrace_symbols)
{
fprintf(stderr, "Couldn't get a stack trace." EOL);
fprintf(file, "Couldn't get a stack trace." EOL);
return;
}
backtrace_t backtrace;
backtrace_symbols_t backtrace_symbols;
backtrace = nasty_cast<backtrace_t, void*>(dlsym(RTLD_DEFAULT, "backtrace"));
backtrace_symbols = nasty_cast<backtrace_symbols_t, void*>(dlsym(RTLD_DEFAULT, "backtrace_symbols"));
if (!backtrace || !backtrace_symbols)
{
fprintf(stderr, "Couldn't get a stack trace." EOL);
fprintf(file, "Couldn't get a stack trace." EOL);
return;
}
// Now we prettify the printout to even show demangled C++ function names.
std::string bt = "";
for (int i = 0; i < num_frames; i++) {
// Now we prettify the printout to even show demangled C++ function names.
std::string bt = "";
for (int i = 0; i < num_frames; i++) {
char *addr = ::strstr(symbols[i], "0x");
char *mangled = ::strchr(addr, ' ') + 1;
char *offset = ::strchr(addr, '+');
char *postmangle = ::strchr(mangled, ' ');
if (mangled) *(mangled - 1) = 0;
bt += addr;
int status;
bt += ": ";
if (addr && mangled) {
if (postmangle)
*postmangle = '\0';
char *realname = abi::__cxa_demangle(mangled, 0, 0, &status);
if (realname) {
bt += realname;
} else {
bt += mangled;
}
bt += " ";
bt += offset;
free(realname);
}
char *addr = ::strstr(symbols[i], "0x");
char *mangled = ::strchr(addr, ' ') + 1;
char *offset = ::strchr(addr, '+');
char *postmangle = ::strchr(mangled, ' ');
if (mangled)
*(mangled - 1) = 0;
bt += addr;
int status;
bt += ": ";
if (addr && mangled)
{
if (postmangle)
*postmangle = '\0';
char *realname = abi::__cxa_demangle(mangled, 0, 0, &status);
if (realname)
bt += realname;
else
bt += mangled;
bt += " ";
bt += offset;
free(realname);
}
bt += symbols[i];
int status;
/* extract the identifier from symbols[i]. It's inside of parens. */
char * firstparen = ::strchr(symbols[i], '(');
char * lastparen = ::strchr(symbols[i], '+');
if (firstparen != 0 && lastparen != 0 && firstparen < lastparen) {
bt += ": ";
*lastparen = '\0';
char * realname = abi::__cxa_demangle(firstparen + 1, 0, 0, &status);
if (realname != NULL) {
bt += realname;
}
free(realname);
}
bt += symbols[i];
int status;
// Extract the identifier from symbols[i]. It's inside of parens.
char *firstparen = ::strchr(symbols[i], '(');
char *lastparen = ::strchr(symbols[i], '+');
if (firstparen != 0 && lastparen != 0 && firstparen < lastparen)
{
bt += ": ";
*lastparen = '\0';
char *realname = abi::__cxa_demangle(firstparen + 1, 0, 0, &status);
if (realname != NULL)
bt += realname;
free(realname);
}