16#define BACKTRACE() PDEBUG << stacktrace(16)
18static inline QString stacktrace(
unsigned int max_frames = 63) {
19 QString text =
"Backtrace:\n";
22 void *addrlist[max_frames+1];
25 int addrlen = backtrace(addrlist,
sizeof(addrlist) /
sizeof(
void*));
27 text +=
" <empty, possibly corrupt>\n";
33 char** symbollist = backtrace_symbols(addrlist, addrlen);
36 size_t funcnamesize = 256;
37 char* funcname = (
char*)malloc(funcnamesize);
41 for (
int i = 1; i < addrlen; i++) {
42 char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
46 for (
char *p = symbollist[i]; *p; ++p) {
47 if (*p ==
'(') begin_name = p;
48 else if (*p ==
'+') begin_offset = p;
49 else if (*p ==
')' && begin_offset) {
55 if (begin_name && begin_offset && end_offset && begin_name < begin_offset) {
57 *begin_offset++ =
'\0';
65 char* ret = abi::__cxa_demangle(begin_name,
66 funcname, &funcnamesize, &status);
69 text += QString(
" %1 : %2+%3\n")
77 text += QString(
" %1 : %2+%3\n")
85 text += QString(
" %1\n").arg(symbollist[i]);