From 1da7438e390965350b9bd09a00887e81ed91657c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20B=C3=A1lint=20Misius?= Date: Fri, 30 Dec 2022 08:21:02 +0100 Subject: [PATCH] Add ability to disable blue screens This will let us produce crash dumps on user machines. --- src/PowderToySDL.cpp | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-) diff --git a/src/PowderToySDL.cpp b/src/PowderToySDL.cpp index 113581756..78f269678 100644 --- a/src/PowderToySDL.cpp +++ b/src/PowderToySDL.cpp @@ -309,6 +309,7 @@ std::map readArguments(int argc, char * argv[]) arguments["sound"] = "false"; arguments["kiosk"] = "false"; arguments["redirect"] = "false"; + arguments["nobluescreen"] = "false"; arguments["scripts"] = "false"; arguments["open"] = ""; arguments["ddir"] = ""; @@ -353,6 +354,10 @@ std::map readArguments(int argc, char * argv[]) { arguments["redirect"] = "true"; } + else if (!strncmp(argv[i], "nobluescreen", 12)) + { + arguments["nobluescreen"] = "true"; + } else if (!strncmp(argv[i], "sound", 5)) { arguments["sound"] = "true"; @@ -866,11 +871,19 @@ int main(int argc, char * argv[]) engine->SetFastQuit(Client::Ref().GetPrefBool("FastQuit", true)); #if !defined(DEBUG) - //Get ready to catch any dodgy errors - signal(SIGSEGV, SigHandler); - signal(SIGFPE, SigHandler); - signal(SIGILL, SigHandler); - signal(SIGABRT, SigHandler); + bool enableBluescreen = true; + if(arguments["nobluescreen"] == "true") + { + enableBluescreen = false; + } + if (enableBluescreen) + { + //Get ready to catch any dodgy errors + signal(SIGSEGV, SigHandler); + signal(SIGFPE, SigHandler); + signal(SIGILL, SigHandler); + signal(SIGABRT, SigHandler); + } #endif #ifdef X86_SSE @@ -881,10 +894,8 @@ int main(int argc, char * argv[]) #endif GameController * gameController = NULL; -#if !defined(DEBUG) - try { -#endif + auto wrapWithBluescreen = [&]() { gameController = new GameController(); engine->ShowWindow(gameController->GetView()); @@ -970,14 +981,23 @@ int main(int argc, char * argv[]) EngineProcess(); SaveWindowPosition(); + }; #if !defined(DEBUG) - } - catch(std::exception& e) + if (enableBluescreen) { - BlueScreen(ByteString(e.what()).FromUtf8()); + try + { + wrapWithBluescreen(); + } + catch (const std::exception &e) + { + BlueScreen(ByteString(e.what()).FromUtf8()); + } } + else #endif + wrapWithBluescreen(); // the else branch of the if in the #if !defined(DEBUG) ui::Engine::Ref().CloseWindow(); delete gameController;