#include "dbghelp.h"
LONG CALLBACK HandleException(EXCEPTION_POINTERS* e) {
HANDLE process = GetCurrentProcess();
SymInitialize(process, NULL, TRUE);
CONTEXT c = *e->ContextRecord;
STACKFRAME64 s;
s.AddrPC.Mode = AddrModeFlat;
s.AddrStack.Mode = AddrModeFlat;
s.AddrFrame.Mode = AddrModeFlat;
s.AddrPC.Offset = c.Eip;
s.AddrStack.Offset = c.Esp;
s.AddrFrame.Offset = c.Ebp;
DWORD offset_from_symbol=0;
IMAGEHLP_LINE64 line = {0};
DWORD64 displacement;
IMAGEHLP_SYMBOL64 *sym = (IMAGEHLP_SYMBOL64*) new BYTE[sizeof(IMAGEHLP_SYMBOL64) + 1024];
memset(sym, '\0', sizeof(*sym) + 1024);
sym->SizeOfStruct = sizeof(*sym);
sym->MaxNameLength = 1024;
stringstream ss;
ss << "snap|";
int count = 0;
do {
if(!StackWalk64(IMAGE_FILE_MACHINE_I386, process, GetCurrentThread(), &s, &c,
NULL, SymFunctionTableAccess64, SymGetModuleBase64, NULL))
break;
if(s.AddrPC.Offset != 0) {
if(SymGetSymFromAddr64(process, s.AddrPC.Offset, &displacement, sym)) {
//cout << sym->Name << endl;
}
if(SymGetLineFromAddr64(process, s.AddrPC.Offset, &offset_from_symbol, &line)) {
string path = string(line.FileName);
size_t pos = path.find_last_of("\\");
string file = path;
if(pos > 0) file = path.substr(pos + 1);
if(count > 0) ss << ",";
ss << file << "#" << sym->Name << "(" << line.LineNumber << ")";
}
count++;
}
} while(s.AddrReturn.Offset != 0);
cout << ss.str() << endl;
//return EXCEPTION_EXECUTE_HANDLER; // closes app
//return EXCEPTION_CONTINUE_EXECUTION; // loops!?
return EXCEPTION_CONTINUE_SEARCH; // yay!
}
Just call with: SetUnhandledExceptionFilter(HandleException);