115 fprintf(out,
"---- Unhandled Exception: Stack Trace ----\n");
117 stringstream stack_output;
121 HANDLE process = GetCurrentProcess();
122 HANDLE thread = GetCurrentThread();
125 memset(&context, 0,
sizeof(CONTEXT));
126 context.ContextFlags = CONTEXT_FULL;
127 RtlCaptureContext(&context);
129 SymInitialize(process, NULL, TRUE);
132 STACKFRAME64 stackframe;
133 ZeroMemory(&stackframe,
sizeof(STACKFRAME64));
136 image = IMAGE_FILE_MACHINE_I386;
137 stackframe.AddrPC.Offset = context.Eip;
138 stackframe.AddrPC.Mode = AddrModeFlat;
139 stackframe.AddrFrame.Offset = context.Ebp;
140 stackframe.AddrFrame.Mode = AddrModeFlat;
141 stackframe.AddrStack.Offset = context.Esp;
142 stackframe.AddrStack.Mode = AddrModeFlat;
144 image = IMAGE_FILE_MACHINE_AMD64;
145 stackframe.AddrPC.Offset = context.Rip;
146 stackframe.AddrPC.Mode = AddrModeFlat;
147 stackframe.AddrFrame.Offset = context.Rsp;
148 stackframe.AddrFrame.Mode = AddrModeFlat;
149 stackframe.AddrStack.Offset = context.Rsp;
150 stackframe.AddrStack.Mode = AddrModeFlat;
152 image = IMAGE_FILE_MACHINE_IA64;
153 stackframe.AddrPC.Offset = context.StIIP;
154 stackframe.AddrPC.Mode = AddrModeFlat;
155 stackframe.AddrFrame.Offset = context.IntSp;
156 stackframe.AddrFrame.Mode = AddrModeFlat;
157 stackframe.AddrBStore.Offset = context.RsBSP;
158 stackframe.AddrBStore.Mode = AddrModeFlat;
159 stackframe.AddrStack.Offset = context.IntSp;
160 stackframe.AddrStack.Mode = AddrModeFlat;
164 for (
size_t i = 0; i < max_frames; i++) {
166 BOOL result = StackWalk64(
167 image, process, thread,
168 &stackframe, &context, NULL,
169 SymFunctionTableAccess64, SymGetModuleBase64, NULL);
171 if (i <= 2) {
continue; }
172 if (!result) {
break; }
174 char buffer[
sizeof(SYMBOL_INFO) + MAX_SYM_NAME *
sizeof(TCHAR)];
175 PSYMBOL_INFO symbol = (PSYMBOL_INFO)buffer;
176 symbol->SizeOfStruct =
sizeof(SYMBOL_INFO);
177 symbol->MaxNameLen = MAX_SYM_NAME;
178 WINBOOL found_symbol = SymFromAddr(process, stackframe.AddrPC.Offset, NULL, symbol);
181 printf(
"[%i] %s, address 0x%0X\n", i, symbol->Name, symbol->Address);
182 stack_output << left << setw(30) << symbol->Name <<
" " << setw(40) << std::hex << symbol->Address << std::dec << endl;
184 printf(
"[%i] ???\n", i);
185 stack_output << left << setw(30) <<
"???" << endl;
193 void* addrlist[max_frames+1];
196 unsigned int addrlen = backtrace( addrlist,
sizeof( addrlist ) /
sizeof(
void* ));
200 fprintf(out,
" No stack trace found (addrlen == 0)\n");
208 char** symbollist = backtrace_symbols( addrlist, addrlen );
210 size_t funcnamesize = 1024;
215 for (
unsigned int i = 4; i < addrlen; i++ )
217 char* begin_name = NULL;
218 char* begin_offset = NULL;
219 char* end_offset = NULL;
224 for (
char *p = symbollist[i]; *p; ++p )
226 if (( *p ==
'_' ) && ( *(p-1) ==
' ' ))
228 else if ( *p ==
'+' )
232 if ( begin_name && begin_offset && ( begin_name < begin_offset ))
234 *begin_name++ =
'\0';
235 *begin_offset++ =
'\0';
241 char* ret = abi::__cxa_demangle( begin_name, &funcname[0], &funcnamesize, &status );
245 fprintf( out,
" %-30s %-40s %s\n", symbollist[i], funcname, begin_offset );
246 stack_output << left <<
" " << setw(30) << symbollist[i] <<
" " << setw(40) << funcname <<
" " << begin_offset << endl;
250 fprintf( out,
" %-30s %-38s() %s\n", symbollist[i], begin_name, begin_offset );
251 stack_output << left <<
" " << setw(30) << symbollist[i] <<
" " << setw(38) << begin_name <<
" " << begin_offset << endl;
257 for (
char *p = symbollist[i]; *p; ++p )
261 else if ( *p ==
'+' )
263 else if ( *p ==
')' && ( begin_offset || begin_name ))
267 if ( begin_name && end_offset && ( begin_name < end_offset ))
269 *begin_name++ =
'\0';
270 *end_offset++ =
'\0';
272 *begin_offset++ =
'\0';
278 char* ret = abi::__cxa_demangle( begin_name, funcname, &funcnamesize, &status );
279 char* fname = begin_name;
285 fprintf( out,
" %-30s ( %-40s + %-6s) %s\n", symbollist[i], fname, begin_offset, end_offset );
286 stack_output << left <<
" " << setw(30) << symbollist[i] <<
" " << setw(40) << fname <<
" " << begin_offset <<
" " << end_offset << endl;
289 fprintf( out,
" %-30s ( %-40s %-6s) %s\n", symbollist[i], fname,
"", end_offset );
290 stack_output << left <<
" " << setw(30) << symbollist[i] <<
" " << setw(40) << fname <<
" " << end_offset << endl;
296 fprintf(out,
" %-40s\n", symbollist[i]);
297 stack_output << left <<
" " << setw(40) << symbollist[i] << endl;
308 fprintf(out,
"---- End of Stack Trace ----\n");