mirror of
https://github.com/glest/glest-source.git
synced 2025-08-17 21:51:17 +02:00
- Added stack traces to win32 build when we detect an error
This commit is contained in:
@@ -2864,6 +2864,8 @@ int glestMain(int argc, char** argv) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//throw megaglest_runtime_error("Test!");
|
||||||
|
|
||||||
if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_SDL_INFO]) == true) {
|
if(hasCommandArgument(argc, argv,GAME_ARGS[GAME_ARG_SDL_INFO]) == true) {
|
||||||
SDL_version ver;
|
SDL_version ver;
|
||||||
|
|
||||||
|
@@ -125,7 +125,113 @@ void PlatformExceptionHandler::install(string dumpFileName){
|
|||||||
}
|
}
|
||||||
|
|
||||||
string PlatformExceptionHandler::getStackTrace() {
|
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)
|
megaglest_runtime_error::megaglest_runtime_error(const string& __arg)
|
||||||
|
Reference in New Issue
Block a user