18 {
19 QString text = "Backtrace:\n";
20
21
22 void *addrlist[max_frames+1];
23
24
25 int addrlen = backtrace(addrlist, sizeof(addrlist) / sizeof(void*));
26 if (addrlen == 0) {
27 text += " <empty, possibly corrupt>\n";
28 return text;
29 }
30
31
32
33 char** symbollist = backtrace_symbols(addrlist, addrlen);
34
35
36 size_t funcnamesize = 256;
37 char* funcname = (char*)malloc(funcnamesize);
38
39
40
41 for (int i = 1; i < addrlen; i++) {
42 char *begin_name = 0, *begin_offset = 0, *end_offset = 0;
43
44
45
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) {
50 end_offset = p;
51 break;
52 }
53 }
54
55 if (begin_name && begin_offset && end_offset && begin_name < begin_offset) {
56 *begin_name++ = '\0';
57 *begin_offset++ = '\0';
58 *end_offset = '\0';
59
60
61
62
63
64 int status;
65 char* ret = abi::__cxa_demangle(begin_name,
66 funcname, &funcnamesize, &status);
67 if (status == 0) {
68 funcname = ret;
69 text += QString(" %1 : %2+%3\n")
70 .arg(symbollist[i])
71 .arg(funcname)
72 .arg(begin_offset)
73 ;
74 } else {
75
76
77 text += QString(" %1 : %2+%3\n")
78 .arg(symbollist[i])
79 .arg(begin_name)
80 .arg(begin_offset)
81 ;
82 }
83 } else {
84
85 text += QString(" %1\n").arg(symbollist[i]);
86 }
87 }
88
89 free(funcname);
90 free(symbollist);
91 return text;
92}