summaryrefslogtreecommitdiffstats
path: root/src/OSSupport/MiniDumpWriter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/OSSupport/MiniDumpWriter.h')
-rw-r--r--src/OSSupport/MiniDumpWriter.h109
1 files changed, 57 insertions, 52 deletions
diff --git a/src/OSSupport/MiniDumpWriter.h b/src/OSSupport/MiniDumpWriter.h
index c223fa9fb..f02b2f784 100644
--- a/src/OSSupport/MiniDumpWriter.h
+++ b/src/OSSupport/MiniDumpWriter.h
@@ -34,16 +34,18 @@ using MiniDumpWriteDumpFunction = decltype(&MiniDumpWriteDump);
static HINSTANCE m_DbgHelp;
static MiniDumpWriteDumpFunction s_WriteMiniDump; // The function in dbghlp DLL that creates dump files
-static wchar_t s_DumpFileName[MAX_PATH]; // Filename of the dump file; hes to be created before the dump handler kicks in
-static char s_ExceptionStack[128 * 1024]; // Substitute stack, just in case the handler kicks in because of "insufficient stack space"
+static wchar_t
+ s_DumpFileName[MAX_PATH]; // Filename of the dump file; hes to be created before the dump handler kicks in
+static char s_ExceptionStack[128 * 1024]; // Substitute stack, just in case the handler kicks in because of
+ // "insufficient stack space"
static MINIDUMP_TYPE s_DumpFlags = MiniDumpNormal; // By default dump only the stack and some helpers
-/** This function gets called just before the "program executed an illegal instruction and will be terminated" or similar.
-Its purpose is to create the crashdump using the dbghlp DLLs */
+/** This function gets called just before the "program executed an illegal instruction and will be terminated" or
+similar. Its purpose is to create the crashdump using the dbghlp DLLs */
static LONG WINAPI LastChanceExceptionFilter(__in struct _EXCEPTION_POINTERS * a_ExceptionInfo)
{
char * newStack = &s_ExceptionStack[sizeof(s_ExceptionStack) - 1];
@@ -51,19 +53,28 @@ static LONG WINAPI LastChanceExceptionFilter(__in struct _EXCEPTION_POINTERS * a
// Use the substitute stack:
_asm
- {
+ {
mov oldStack, esp
mov esp, newStack
- }
+ }
- MINIDUMP_EXCEPTION_INFORMATION ExcInformation;
+ MINIDUMP_EXCEPTION_INFORMATION ExcInformation;
ExcInformation.ThreadId = GetCurrentThreadId();
ExcInformation.ExceptionPointers = a_ExceptionInfo;
ExcInformation.ClientPointers = 0;
// Write the dump file:
- HANDLE dumpFile = CreateFile(s_DumpFileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
- s_WriteMiniDump(GetCurrentProcess(), GetCurrentProcessId(), dumpFile, s_DumpFlags, (a_ExceptionInfo) ? &ExcInformation : nullptr, nullptr, nullptr);
+ HANDLE dumpFile =
+ CreateFile(s_DumpFileName, GENERIC_WRITE, 0, nullptr, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, nullptr);
+ s_WriteMiniDump(
+ GetCurrentProcess(),
+ GetCurrentProcessId(),
+ dumpFile,
+ s_DumpFlags,
+ (a_ExceptionInfo) ? &ExcInformation : nullptr,
+ nullptr,
+ nullptr
+ );
CloseHandle(dumpFile);
// Revert to old stack:
@@ -81,64 +92,58 @@ static LONG WINAPI LastChanceExceptionFilter(__in struct _EXCEPTION_POINTERS * a
namespace MiniDumpWriter
{
- static void Register()
- {
- // Magic code to produce dump-files on Windows if the server crashes:
-
- m_DbgHelp = LoadLibrary(L"DBGHELP.DLL");
- if (m_DbgHelp == INVALID_HANDLE_VALUE)
- {
- return;
- }
+static void Register()
+{
+ // Magic code to produce dump-files on Windows if the server crashes:
- s_WriteMiniDump = (MiniDumpWriteDumpFunction)GetProcAddress(m_DbgHelp, "MiniDumpWriteDump");
- if (s_WriteMiniDump != nullptr)
- {
- ASSERT(swprintf(s_DumpFileName, ARRAYCOUNT(s_DumpFileName), L"crash_mcs_%x.dmp", GetCurrentProcessId()) > 0);
- SetUnhandledExceptionFilter(LastChanceExceptionFilter);
- }
+ m_DbgHelp = LoadLibrary(L"DBGHELP.DLL");
+ if (m_DbgHelp == INVALID_HANDLE_VALUE)
+ {
+ return;
+ }
- // End of dump-file magic
+ s_WriteMiniDump = (MiniDumpWriteDumpFunction) GetProcAddress(m_DbgHelp, "MiniDumpWriteDump");
+ if (s_WriteMiniDump != nullptr)
+ {
+ ASSERT(swprintf(s_DumpFileName, ARRAYCOUNT(s_DumpFileName), L"crash_mcs_%x.dmp", GetCurrentProcessId()) > 0);
+ SetUnhandledExceptionFilter(LastChanceExceptionFilter);
}
- static void AddDumpFlags(const MiniDumpFlags a_Flags)
+ // End of dump-file magic
+}
+
+static void AddDumpFlags(const MiniDumpFlags a_Flags)
+{
+ switch (a_Flags)
{
- switch (a_Flags)
+ case MiniDumpFlags::WithDataSegments:
+ {
+ s_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithDataSegs);
+ break;
+ }
+ case MiniDumpFlags::WithFullMemory:
{
- case MiniDumpFlags::WithDataSegments:
- {
- s_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithDataSegs);
- break;
- }
- case MiniDumpFlags::WithFullMemory:
- {
- s_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithFullMemory);
- break;
- }
+ s_DumpFlags = static_cast<MINIDUMP_TYPE>(s_DumpFlags | MINIDUMP_TYPE::MiniDumpWithFullMemory);
+ break;
}
}
+}
- static void Unregister()
- {
- FreeLibrary(m_DbgHelp);
- }
-};
+static void Unregister()
+{
+ FreeLibrary(m_DbgHelp);
+}
+}; // namespace MiniDumpWriter
#else
namespace MiniDumpWriter
{
- static void Register()
- {
- }
+static void Register() {}
- static void AddDumpFlags(const MiniDumpFlags)
- {
- }
+static void AddDumpFlags(const MiniDumpFlags) {}
- static void Unregister()
- {
- }
-};
+static void Unregister() {}
+}; // namespace MiniDumpWriter
#endif