diff --git a/CMakeLists.txt b/CMakeLists.txt index 0146209a4..9612572ae 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,9 +31,12 @@ if(WIN32) else() endif() + + option(GENERATE_MINI_DUMP "Generate a minidump on crash" ON) else() SET(USE_DIRECTX OFF) SET(HAVE_FMOD OFF) + SET(GENERATE_MINI_DUMP OFF) endif() if(UNIX AND NOT USE_SDL_MAINLOOP AND NOT APPLE) option(USE_X11 "Use X11 to create windows etc." ON) @@ -951,6 +954,15 @@ elseif(MINGW) target_link_libraries(clonk iberty) endif() +CHECK_INCLUDE_FILE_CXX(getopt.h HAVE_GETOPT_H) + +if(GENERATE_MINI_DUMP) + FIND_PATH(DBGHELP_INCLUDE_DIR NAMES dbghelp.h) + FINDLIB(DBGHELP_LIBRARIES NAMES dbghelp) + target_link_libraries(clonk ${DBGHELP_LIBRARIES}) + include_directories(${DBGHELP_INCLUDE_DIR}) +endif() + if(USE_GL) include(FindOpenGL) FINDLIB(GLEW_LIBRARIES NAMES GLEW glew32 glew32s) diff --git a/config.h.cmake b/config.h.cmake index 087697317..2c7f76db9 100644 --- a/config.h.cmake +++ b/config.h.cmake @@ -198,4 +198,7 @@ #cmakedefine HAVE_NULLPTR 1 /* Use Apple Cocoa for the UI */ -#cmakedefine USE_COCOA 1 \ No newline at end of file +#cmakedefine USE_COCOA 1 + +/* Generate minidumps on crash */ +#cmakedefine GENERATE_MINI_DUMP 1 diff --git a/src/C4WinMain.cpp b/src/C4WinMain.cpp index b399b1f55..bf4736f76 100644 --- a/src/C4WinMain.cpp +++ b/src/C4WinMain.cpp @@ -35,10 +35,6 @@ #ifdef _WIN32 #include -#if defined(_MSC_VER) && !defined(_DEBUG) -//#define GENERATE_MINI_DUMP -#endif - #ifdef GENERATE_MINI_DUMP // Dump generation on crash @@ -48,7 +44,7 @@ static bool FirstCrash = true; -int GenerateDump(EXCEPTION_POINTERS* pExceptionPointers) +WINAPI LONG GenerateDump(EXCEPTION_POINTERS* pExceptionPointers) { if (!FirstCrash) return EXCEPTION_EXECUTE_HANDLER; FirstCrash = false; @@ -84,7 +80,11 @@ int WINAPI WinMain (HINSTANCE hInst, _CrtSetDbgFlag( _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG ) | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); #endif -#ifdef GENERATE_MINI_DUMP +#if defined(GENERATE_MINI_DUMP) && !defined(_MSC_VER) + SetUnhandledExceptionFilter(GenerateDump); +#endif + +#if defined(GENERATE_MINI_DUMP) && defined(_MSC_VER) __try { #endif @@ -127,7 +127,7 @@ int WINAPI WinMain (HINSTANCE hInst, // Return exit code if (!Game.GameOver) return C4XRV_Aborted; return C4XRV_Completed; -#ifdef GENERATE_MINI_DUMP +#if defined(GENERATE_MINI_DUMP) && defined(_MSC_VER) } __except(GenerateDump(GetExceptionInformation())) { return C4XRV_Failure; } #endif }