- Added stack traces to win32 build when we detect an error

This commit is contained in:
Mark Vejvoda 2012-04-14 22:48:49 +00:00
parent 8c0bf75bf5
commit 5cfb7e85d5
2 changed files with 109 additions and 1 deletions

View File

@ -2864,6 +2864,8 @@ int glestMain(int argc, char** argv) {
#endif
}
//throw megaglest_runtime_error("Test!");
if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_SDL_INFO]) == true) {
SDL_version ver;

View File

@ -125,7 +125,113 @@ void PlatformExceptionHandler::install(string dumpFileName){
}
string PlatformExceptionHandler::getStackTrace() {
return "";
string result = "\nStack Trace:\n";
/*
unsigned int i;
const int max_stack_count = 25;
void * stack[ max_stack_count ];
unsigned short frames;
SYMBOL_INFO * symbol;
HANDLE process;
process = GetCurrentProcess();
SymInitialize( process, NULL, TRUE );
frames = CaptureStackBackTrace( 0, max_stack_count, stack, NULL );
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) + 256 * sizeof( char ), 1 );
symbol->MaxNameLen = 255;
symbol->SizeOfStruct = sizeof( SYMBOL_INFO );
IMAGEHLP_LINE li = { sizeof( IMAGEHLP_LINE ) };
char szBuf[8096]="";
for( i = 0; i < frames; i++ ) {
DWORD off=0;
DWORD dwDisp=0;
SymFromAddr( process, ( DWORD64 )( stack[ i ] ), 0, symbol );
SymGetLineFromAddr(process, ( DWORD64 )( stack[ i ] ), &dwDisp, &li);
//if( SymGetSymFromAddr(GetCurrentProcess(), (DWORD)sf.AddrPC.Offset, &off, &si.sym) &&
// SymGetLineFromAddr(GetCurrentProcess(), (DWORD)sf.AddrPC.Offset, &dwDisp, &li)) {
char *del = strrchr(li.FileName, '\\');
//formatstring(t)("%s - %s [%d]\n", symbol.sym.Name, del ? del + 1 : li.FileName, li.LineNumber+dwDisp);
//concatstring(out, t);
//sprintf(szBuf,"%i: %s - 0x%0X\n", frames - i - 1, symbol->Name, symbol->Address );
sprintf(szBuf,"%s - %s [%d]\n", symbol->Name, del ? del + 1 : li.FileName, li.LineNumber+dwDisp);
result += szBuf;
}
free( symbol );
*/
CONTEXT context = { 0 };
context.ContextFlags = CONTEXT_FULL;
IMAGEHLP_SYMBOL *pSym = (IMAGEHLP_SYMBOL*)new BYTE[sizeof(IMAGEHLP_SYMBOL) + 256];
pSym->SizeOfStruct = sizeof(IMAGEHLP_SYMBOL);
pSym->MaxNameLength = 256;
IMAGEHLP_LINE line = { 0 };
line.SizeOfStruct = sizeof(IMAGEHLP_LINE);
IMAGEHLP_MODULE module = { 0 };
module.SizeOfStruct = sizeof(IMAGEHLP_MODULE);
HANDLE hProcess = GetCurrentProcess();
HANDLE hThread = GetCurrentThread();
if (GetThreadContext(hThread, &context)) {
STACKFRAME stackframe = { 0 };
stackframe.AddrPC.Offset = context.Eip;
stackframe.AddrPC.Mode = AddrModeFlat;
stackframe.AddrFrame.Offset = context.Ebp;
stackframe.AddrFrame.Mode = AddrModeFlat;
SymInitialize(hProcess, NULL, TRUE);
BOOL fSuccess = TRUE;
do
{
fSuccess = StackWalk(IMAGE_FILE_MACHINE_I386,
GetCurrentProcess(),
GetCurrentThread(),
&stackframe,
&context,
NULL,
NULL,
NULL,
NULL);
DWORD dwDisplacement = 0;
SymGetSymFromAddr(hProcess, stackframe.AddrPC.Offset, &dwDisplacement, pSym);
SymGetLineFromAddr(hProcess, stackframe.AddrPC.Offset, &dwDisplacement, &line);
SymGetModuleInfo(hProcess, stackframe.AddrPC.Offset, &module);
// RetAddr Arg1 Arg2 Arg3 module!funtion FileName(line)+offset
char szBuf[8096]="";
sprintf(szBuf,"%08lx %08lx %08lx %08lx %s!%s %s(%lu) %+ld\n",
stackframe.AddrReturn.Offset,
stackframe.Params[0],
stackframe.Params[1],
stackframe.Params[2],
pSym->Name,
module.ModuleName,
line.FileName,
line.LineNumber,
dwDisplacement);
result += szBuf;
} while (fSuccess);
SymCleanup(hProcess);
}
return result;
}
megaglest_runtime_error::megaglest_runtime_error(const string& __arg)