Pārlūkot izejas kodu

full crash dump

Andrii Danylchenko 4 gadi atpakaļ
vecāks
revīzija
e220918230
3 mainītis faili ar 28 papildinājumiem un 2 dzēšanām
  1. 4 0
      config/schemas/settings.json
  2. 22 1
      lib/CConsoleHandler.cpp
  3. 2 1
      server/CVCMIServer.cpp

+ 4 - 0
config/schemas/settings.json

@@ -66,6 +66,10 @@
 				"notifications" : {
 					"type" : "boolean",
 					"default" : false
+				},
+				"extraDump" : {
+					"type" : "boolean",
+					"default" : false
 				}
 			}
 		},

+ 22 - 1
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;
 }

+ 2 - 1
server/CVCMIServer.cpp

@@ -334,6 +334,7 @@ void CVCMIServer::threadHandleClient(std::shared_ptr<CConnection> 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<CConnection> c)
 		state = EServerState::SHUTDOWN;
 		handleException();
 		throw;
-	}
+	}*/
 
 	boost::unique_lock<boost::recursive_mutex> queueLock(mx);
 //	if(state != ENDING_AND_STARTING_GAME)