41{
42
43 PID = syscall(SYS_gettid);
44
45
46 const size_t maxStackSize = 20;
47 void * functionStack[maxStackSize];
49
50
51
52 stackSize = backtrace(functionStack,maxStackSize);
53
54
55 char ** functionNames = backtrace_symbols(functionStack,
stackSize);
56 if(functionNames == NULL)
57 {
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
68 if(functionNames[iFunction] == NULL)
69 {
71 continue;
72 }
73
74 char * mangledStart = NULL;
75 char * offsetStart = NULL;
76 char * offsetEnd = NULL;
77
78
79 char * bufferEnd = functionNames[iFunction] + strlen(functionNames[iFunction]);
80 for(char * buffer = functionNames[iFunction];buffer != bufferEnd;buffer++)
81 {
82
83 if(*buffer == '(')
84 mangledStart = buffer;
85
86 else if(*buffer == '+')
87 offsetStart = buffer;
88
89 else if( (*buffer == ')') && (offsetStart != NULL))
90 {
91 offsetEnd = buffer;
92 break;
93 }
94 }
95
96
97 if( (mangledStart != NULL) &&
98 (offsetStart != NULL) &&
99 (offsetEnd != NULL) &&
100 (mangledStart < offsetStart)
101 )
102 {
103
104 mangledStart++;
105
106 *offsetStart = '\0';
107
108
109 offsetStart++;
110
111 *offsetEnd = '\0';
112
113
114 size_t demangledSize = 0;
115 int demangledRet = 0;
116 char * retName = abi::__cxa_demangle(mangledStart,
117 demangledName,
118 &demangledSize,
119 &demangledRet);
120
121 if((demangledRet == 0) && (retName != NULL))
122 {
123
124 demangledName = retName;
126 }
127 else
128 {
130 }
131 }
132 else
133 {
135 }
136 }
137
138 if(demangledName != NULL)
139 free(demangledName);
140 free(functionNames);
141
142}
void AppendStackLine(const char *line)