- fprintf (f, "Exception thrown:");
- for (dbg::stack::const_iterator i = s.begin(); i != s.end(); ++i) {
- fprintf (f, "%p %s %d %s\n", i->instruction, i->function.c_str(), i->line, i->module.c_str());
+ fprintf (f, "C-style exception %d\n", info->ExceptionRecord->ExceptionCode);
+ fclose(f);
+
+ if (info->ExceptionRecord->ExceptionCode != EXCEPTION_STACK_OVERFLOW) {
+ CONTEXT* context = info->ContextRecord;
+ SymInitialize (GetCurrentProcess (), 0, true);
+
+ STACKFRAME frame = { 0 };
+
+ /* setup initial stack frame */
+#if _WIN64
+ frame.AddrPC.Offset = context->Rip;
+ frame.AddrStack.Offset = context->Rsp;
+ frame.AddrFrame.Offset = context->Rbp;
+#else
+ frame.AddrPC.Offset = context->Eip;
+ frame.AddrStack.Offset = context->Esp;
+ frame.AddrFrame.Offset = context->Ebp;
+#endif
+ frame.AddrPC.Mode = AddrModeFlat;
+ frame.AddrStack.Mode = AddrModeFlat;
+ frame.AddrFrame.Mode = AddrModeFlat;
+
+ while (
+ StackWalk (
+ IMAGE_FILE_MACHINE_I386,
+ GetCurrentProcess (),
+ GetCurrentThread (),
+ &frame,
+ context,
+ 0,
+ SymFunctionTableAccess,
+ SymGetModuleBase,
+ 0
+ )
+ ) {
+ addr2line((void *) frame.AddrPC.Offset);
+ }
+ } else {
+#ifdef _WIN64
+ addr2line ((void *) info->ContextRecord->Rip);
+#else
+ addr2line ((void *) info->ContextRecord->Eip);
+#endif