stacktrace crash output for windows client&server, debug cleanups
git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@3040 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
@@ -302,6 +302,35 @@ bool delfile(const char *path)
|
||||
return !remove(path);
|
||||
}
|
||||
|
||||
///////////////////////// debugging ///////////////////////
|
||||
|
||||
#if defined(WIN32) && !defined(_DEBUG) && !defined(__GNUC__)
|
||||
void stackdumper(unsigned int type, EXCEPTION_POINTERS *ep)
|
||||
{
|
||||
if(!ep) fatal("unknown type");
|
||||
EXCEPTION_RECORD *er = ep->ExceptionRecord;
|
||||
CONTEXT *context = ep->ContextRecord;
|
||||
string out, t;
|
||||
s_sprintf(out)("Win32 Exception: 0x%x [0x%x]\n\n", er->ExceptionCode, er->ExceptionCode==EXCEPTION_ACCESS_VIOLATION ? er->ExceptionInformation[1] : -1);
|
||||
STACKFRAME sf = {{context->Eip, 0, AddrModeFlat}, {}, {context->Ebp, 0, AddrModeFlat}, {context->Esp, 0, AddrModeFlat}, 0};
|
||||
SymInitialize(GetCurrentProcess(), NULL, TRUE);
|
||||
|
||||
while(::StackWalk(IMAGE_FILE_MACHINE_I386, GetCurrentProcess(), GetCurrentThread(), &sf, context, NULL, ::SymFunctionTableAccess, ::SymGetModuleBase, NULL))
|
||||
{
|
||||
struct { IMAGEHLP_SYMBOL sym; string n; } si = { { sizeof( IMAGEHLP_SYMBOL ), 0, 0, 0, sizeof(string) } };
|
||||
IMAGEHLP_LINE li = { sizeof( IMAGEHLP_LINE ) };
|
||||
DWORD off;
|
||||
if(SymGetSymFromAddr(GetCurrentProcess(), (DWORD)sf.AddrPC.Offset, &off, &si.sym) && SymGetLineFromAddr(GetCurrentProcess(), (DWORD)sf.AddrPC.Offset, &off, &li))
|
||||
{
|
||||
char *del = strrchr(li.FileName, '\\');
|
||||
s_sprintf(t)("%s - %s [%d]\n", si.sym.Name, del ? del + 1 : li.FileName, li.LineNumber);
|
||||
s_strcat(out, t);
|
||||
}
|
||||
}
|
||||
fatal(out);
|
||||
}
|
||||
#endif
|
||||
|
||||
///////////////////////// misc tools ///////////////////////
|
||||
|
||||
bool cmpb(void *b, int n, enet_uint32 c)
|
||||
|
||||
Reference in New Issue
Block a user