From 3f9bf1ab27f0d0b871cf6363bfd0214398bb6fc2 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 1 Nov 2022 12:42:02 +0000 Subject: [PATCH] Fix crash handler not launching as expected in official builds --- renderdoc/core/core.cpp | 45 +++++++++++++---------------- renderdoccmd/renderdoccmd.cpp | 6 +++- renderdoccmd/renderdoccmd.h | 1 + renderdoccmd/renderdoccmd_win32.cpp | 1 + 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/renderdoc/core/core.cpp b/renderdoc/core/core.cpp index 4ad37e40c..46aa68d93 100644 --- a/renderdoc/core/core.cpp +++ b/renderdoc/core/core.cpp @@ -297,18 +297,20 @@ void RenderDoc::RecreateCrashHandler() { SCOPED_WRITELOCK(m_ExHandlerLock); - if(!m_ExHandler) - return; - #if ENABLED(RDOC_CRASH_HANDLER) -#if ENABLED(RDOC_WIN32) - // there are way too many invalid reports coming from chrome, completely disable the crash handler - // in that case. rdcstr exename; FileIO::GetExecutableFilename(exename); exename = strlower(exename); + // only create crash handler when we're not in renderdoccmd (to prevent infinite loop as + // the crash handler itself launches renderdoccmd) + if(exename.contains("renderdoccmd")) + return; + +#if ENABLED(RDOC_WIN32) + // there are way too many invalid reports coming from chrome, completely disable the crash handler + // in that case. if(exename.find("chrome.exe") && (GetModuleHandleA("chrome_elf.dll") || GetModuleHandleA("chrome_child.dll"))) { @@ -504,10 +506,13 @@ void RenderDoc::Initialise() RDCWARN("dlsym() hooking enabled!"); #endif - if(m_RemoteIdent == 0) - RDCWARN("Couldn't open socket for target control"); - else - RDCDEBUG("Listening for target control on %u", m_RemoteIdent); + if(!IsReplayApp()) + { + if(m_RemoteIdent == 0) + RDCWARN("Couldn't open socket for target control"); + else + RDCDEBUG("Listening for target control on %u", m_RemoteIdent); + } Keyboard::Init(); @@ -515,19 +520,7 @@ void RenderDoc::Initialise() m_ExHandler = NULL; - { - rdcstr curFile; - FileIO::GetExecutableFilename(curFile); - - rdcstr f = strlower(curFile); - - // only create crash handler when we're not in renderdoccmd.exe (to prevent infinite loop as - // the crash handler itself launches renderdoccmd.exe) - if(!f.contains("renderdoccmd.exe")) - { - RecreateCrashHandler(); - } - } + RecreateCrashHandler(); // begin printing to stdout/stderr after this point, earlier logging is debugging // cruft that we don't want cluttering output. @@ -615,11 +608,13 @@ void RenderDoc::InitialiseReplay(GlobalEnvironment env, const rdcarray & m_GlobalEnv.xlibDisplay = XOpenDisplay(NULL); #endif + rdcstr exename; + FileIO::GetExecutableFilename(exename); + RDCLOG("Replay application '%s' launched", exename.c_str()); if(!args.empty()) { - RDCDEBUG("Replay application launched with parameters:"); for(size_t i = 0; i < args.size(); i++) - RDCDEBUG("[%u]: %s", (uint32_t)i, args[i].c_str()); + RDCLOG("Parameter [%u]: %s", (uint32_t)i, args[i].c_str()); } if(args.contains("--crash")) diff --git a/renderdoccmd/renderdoccmd.cpp b/renderdoccmd/renderdoccmd.cpp index 226dcf607..d1bb2e0c4 100644 --- a/renderdoccmd/renderdoccmd.cpp +++ b/renderdoccmd/renderdoccmd.cpp @@ -1685,7 +1685,11 @@ int renderdoccmd(GlobalEnvironment &env, std::vector &argv) return 1; } - RENDERDOC_InitialiseReplay(env, convertArgs(cmd.rest())); + rdcarray args = convertArgs(cmd.rest()); + + args.append(it->second->ReplayArgs()); + + RENDERDOC_InitialiseReplay(env, args); int ret = it->second->Execute(opts); diff --git a/renderdoccmd/renderdoccmd.h b/renderdoccmd/renderdoccmd.h index 0c0255820..fd6b32d78 100644 --- a/renderdoccmd/renderdoccmd.h +++ b/renderdoccmd/renderdoccmd.h @@ -35,6 +35,7 @@ struct Command virtual int Execute(const CaptureOptions &opts) = 0; virtual const char *Description() = 0; + virtual rdcarray ReplayArgs() { return {}; } virtual bool HandlesUsageManually() { return false; } virtual bool IsInternalOnly() = 0; virtual bool IsCaptureCommand() = 0; diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index 57a9070bb..f8b241f31 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -468,6 +468,7 @@ public: pipe = conv(parser.get("pipe")); return true; } + virtual rdcarray ReplayArgs() { return {"--crash"}; } virtual int Execute(const CaptureOptions &) { CrashGenerationServer *crashServer = NULL;