42{
43
44 PID = syscall(SYS_gettid);
45
46
47 const size_t maxStackSize = 20;
48 void* functionStack[maxStackSize];
50
51
52
53 stackSize = backtrace(functionStack, maxStackSize);
54
55
56 char** functionNames = backtrace_symbols(functionStack,
stackSize);
57 if (functionNames == NULL) {
58 fprintf(stderr, "Error in exBase::GenerateStackTrace(). backtrace_symbols failed\n");
59 return;
60 }
61
62 char* demangledName = NULL;
63
64 for (
size_t iFunction = 3; iFunction <
stackSize; iFunction++) {
65
66
67 if (functionNames[iFunction] == NULL) {
69 continue;
70 }
71
72 char* mangledStart = NULL;
73 char* offsetStart = NULL;
74 char* offsetEnd = NULL;
75
76
77 char* bufferEnd = functionNames[iFunction] + strlen(functionNames[iFunction]);
78 for (char* buffer = functionNames[iFunction]; buffer != bufferEnd; buffer++) {
79
80 if (*buffer == '(')
81 mangledStart = buffer;
82
83 else if (*buffer == '+')
84 offsetStart = buffer;
85
86 else if ((*buffer == ')') && (offsetStart != NULL)) {
87 offsetEnd = buffer;
88 break;
89 }
90 }
91
92
93 if ((mangledStart != NULL) && (offsetStart != NULL) && (offsetEnd != NULL) && (mangledStart < offsetStart)) {
94
95 mangledStart++;
96
97 *offsetStart = '\0';
98
99
100 offsetStart++;
101
102 *offsetEnd = '\0';
103
104
105 size_t demangledSize = 0;
106 int demangledRet = 0;
107 char* retName = abi::__cxa_demangle(mangledStart, demangledName, &demangledSize, &demangledRet);
108
109 if ((demangledRet == 0) && (retName != NULL)) {
110
111 demangledName = retName;
113 } else
114 {
116 }
117 } else
118 {
120 }
121 }
122
123 if (demangledName != NULL)
124 free(demangledName);
125 free(functionNames);
126}
void AppendStackLine(const char *line)