diff --git a/config/schemas/settings.json b/config/schemas/settings.json index 4488317be..a86275a54 100644 --- a/config/schemas/settings.json +++ b/config/schemas/settings.json @@ -66,6 +66,10 @@ "notifications" : { "type" : "boolean", "default" : false + }, + "extraDump" : { + "type" : "boolean", + "default" : false } } }, diff --git a/lib/CConsoleHandler.cpp b/lib/CConsoleHandler.cpp index e6a5af88d..b5489b984 100644 --- a/lib/CConsoleHandler.cpp +++ b/lib/CConsoleHandler.cpp @@ -9,6 +9,7 @@ */ #include "StdInc.h" #include "CConsoleHandler.h" +#include "CConfigHandler.h" #include "CThreadHelper.h" @@ -135,7 +136,27 @@ LONG WINAPI onUnhandledException(EXCEPTION_POINTERS* exception) strcat(mname, "_crashinfo.dmp"); HANDLE dfile = CreateFileA(mname, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, 0, CREATE_ALWAYS, 0, 0); logGlobal->error("Crash info will be put in %s", mname); - MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), dfile, MiniDumpWithDataSegs, &meinfo, 0, 0); + + // flush loggers + std::string padding(1000, '@'); + + logGlobal->error(padding); + logAi->error(padding); + logNetwork->error(padding); + + auto dumpType = MiniDumpWithDataSegs; + + if(settings["general"]["extraDump"].Bool()) + { + dumpType = (MINIDUMP_TYPE)( + MiniDumpWithFullMemory + | MiniDumpWithFullMemoryInfo + | MiniDumpWithHandleData + | MiniDumpWithUnloadedModules + | MiniDumpWithThreadInfo); + } + + MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), dfile, dumpType, &meinfo, 0, 0); MessageBoxA(0, "VCMI has crashed. We are sorry. File with information about encountered problem has been created.", "VCMI Crashhandler", MB_OK | MB_ICONERROR); return EXCEPTION_EXECUTE_HANDLER; } diff --git a/server/CVCMIServer.cpp b/server/CVCMIServer.cpp index 43a2e0f62..837b0ee32 100644 --- a/server/CVCMIServer.cpp +++ b/server/CVCMIServer.cpp @@ -334,6 +334,7 @@ void CVCMIServer::threadHandleClient(std::shared_ptr c) if(state != EServerState::LOBBY) gh->handleClientDisconnection(c); } + /* catch(const std::exception & e) { (void)e; @@ -345,7 +346,7 @@ void CVCMIServer::threadHandleClient(std::shared_ptr c) state = EServerState::SHUTDOWN; handleException(); throw; - } + }*/ boost::unique_lock queueLock(mx); // if(state != ENDING_AND_STARTING_GAME)