#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);