mirror of
https://github.com/glest/glest-source.git
synced 2025-02-25 20:22:31 +01:00
- Added stack traces to win32 build when we detect an error
This commit is contained in:
parent
8c0bf75bf5
commit
5cfb7e85d5
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user