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.
This commit is contained in:
Joel Dice 2011-02-11 15:02:09 -07:00
parent 5c88f77412
commit eae79fdb34

View File

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