From 76dd7ae6745e565f6a568a3df5bc71907f44b40a Mon Sep 17 00:00:00 2001 From: FunkyFr3sh Date: Thu, 28 Jan 2021 07:38:03 +0100 Subject: [PATCH] create MiniDump on crash in Debug builds --- cnc-ddraw.vcxproj | 4 ++-- inc/debug.h | 2 +- src/debug.c | 32 ++++++++++++++++++++++++++++++++ src/dllmain.c | 1 + 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/cnc-ddraw.vcxproj b/cnc-ddraw.vcxproj index d58bc6c..aea7ddb 100644 --- a/cnc-ddraw.vcxproj +++ b/cnc-ddraw.vcxproj @@ -167,7 +167,7 @@ Windows - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) ddraw.def @@ -214,7 +214,7 @@ if exist "$(LocalDebuggerCommand)" if exist "$(LocalDebuggerWorkingDirectory)" Windows true true - winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) + dbghelp.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) ddraw.def diff --git a/inc/debug.h b/inc/debug.h index de42ee0..37475c5 100644 --- a/inc/debug.h +++ b/inc/debug.h @@ -4,7 +4,7 @@ #define WIN32_LEAN_AND_MEAN #include - +int dbg_exception_handler(EXCEPTION_POINTERS* exception); void dbg_counter_start(); double dbg_counter_stop(); void dbg_debug_string(const char *format, ...); diff --git a/src/debug.c b/src/debug.c index bf23214..ff43323 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,4 +1,5 @@ #include +#include > #include #include "dd.h" #include "ddraw.h" @@ -12,6 +13,37 @@ DWORD g_dbg_frame_count = 0; static LONGLONG g_dbg_counter_start_time = 0; static double g_dbg_counter_freq = 0.0; +#if _DEBUG +int dbg_exception_handler(EXCEPTION_POINTERS* exception) +{ + HANDLE dmp = + CreateFile( + "cnc-ddraw.dmp", + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_WRITE | FILE_SHARE_READ, + 0, + CREATE_ALWAYS, + 0, + 0); + + MINIDUMP_EXCEPTION_INFORMATION info; + info.ThreadId = GetCurrentThreadId(); + info.ExceptionPointers = exception; + info.ClientPointers = TRUE; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + dmp, + 0, + &info, + NULL, + NULL); + + return EXCEPTION_EXECUTE_HANDLER; +} +#endif + void dbg_init() { static int stdout_open = 0; diff --git a/src/dllmain.c b/src/dllmain.c index a453249..a03c32f 100644 --- a/src/dllmain.c +++ b/src/dllmain.c @@ -32,6 +32,7 @@ BOOL WINAPI DllMain(HANDLE hDll, DWORD dwReason, LPVOID lpReserved) #if _DEBUG dbg_init(); dprintf("cnc-ddraw = %p\n", hDll); + SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)dbg_exception_handler); #endif g_ddraw_module = hDll;