From eae79fdb34f8a223cb1b58de24de80771c14adb7 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Fri, 11 Feb 2011 15:02:09 -0700 Subject: [PATCH] clean up MINIDUMP_EXCEPTION_INFORMATION mess in windows.cpp The last two commits were meant to work around a supposed bug in mingw-w64's dbghelp.h, but closer inspection reminded me that we're not using dbghelp.h at all; legacy mingw doesn't have it, so we had to declare the structures we needed ourselves based on the MSDN documentation. What that documentation doesn't mention is that MINIDUMP_EXCEPTION_INFORMATION is subject to a special, packed layout, which we must represent using the __packed__ attribute. --- src/windows.cpp | 23 +++-------------------- 1 file changed, 3 insertions(+), 20 deletions(-) diff --git a/src/windows.cpp b/src/windows.cpp index 21b9a0ed64..c4809c072c 100644 --- a/src/windows.cpp +++ b/src/windows.cpp @@ -833,7 +833,7 @@ class MySystem: public System { const char* crashDumpDirectory; }; -struct MINIDUMP_EXCEPTION_INFORMATION { +struct __attribute__ ((__packed__)) MINIDUMP_EXCEPTION_INFORMATION { DWORD thread; LPEXCEPTION_POINTERS exception; BOOL exceptionInCurrentAddressSpace; @@ -856,16 +856,6 @@ typedef BOOL (*MiniDumpWriteDumpType) const MINIDUMP_USER_STREAM_INFORMATION* userStream, const MINIDUMP_CALLBACK_INFORMATION* callback); -// dbghelp.dll expects that MINIDUMP_EXCEPTION_INFORMATION has a -// packed layout and will crash if it doesn't (at least on 64-bit -// systems), but as of this writing mingw-w64's version is not -// declared to be so. Hence this workaround: -struct __attribute__ ((__packed__)) My_MINIDUMP_EXCEPTION_INFORMATION { - DWORD ThreadId; - PEXCEPTION_POINTERS ExceptionPointers; - WINBOOL ClientPointers; -}; - void dump(LPEXCEPTION_POINTERS e, const char* directory) { @@ -887,22 +877,15 @@ dump(LPEXCEPTION_POINTERS e, const char* directory) (name, FILE_WRITE_DATA, 0, 0, CREATE_ALWAYS, 0, 0); if (file != INVALID_HANDLE_VALUE) { - My_MINIDUMP_EXCEPTION_INFORMATION exception + MINIDUMP_EXCEPTION_INFORMATION exception = { GetCurrentThreadId(), e, true }; - - union { - MINIDUMP_EXCEPTION_INFORMATION* exceptionPointer; - My_MINIDUMP_EXCEPTION_INFORMATION* myExceptionPointer; - }; - - myExceptionPointer = &exception; MiniDumpWriteDump (GetCurrentProcess(), GetCurrentProcessId(), file, MiniDumpWithFullMemory, - exceptionPointer, + &exception, 0, 0);