From 5102f4b11d3217b2675656b230a52907a26aeb3a Mon Sep 17 00:00:00 2001 From: AnyOldName3 Date: Wed, 5 Jul 2023 17:42:09 +0100 Subject: [PATCH] Update Windows crash dump path once we know where we're logging --- .../crashcatcher/windows_crashcatcher.cpp | 19 +++++++++++++++++++ .../crashcatcher/windows_crashcatcher.hpp | 6 ++++++ components/debug/debugging.cpp | 10 ++++++++++ 3 files changed, 35 insertions(+) diff --git a/components/crashcatcher/windows_crashcatcher.cpp b/components/crashcatcher/windows_crashcatcher.cpp index 080bbda673..f39accabd2 100644 --- a/components/crashcatcher/windows_crashcatcher.cpp +++ b/components/crashcatcher/windows_crashcatcher.cpp @@ -75,6 +75,25 @@ namespace Crash CloseHandle(mShmHandle); } + void CrashCatcher::updateDumpPaths(const std::string& crashDumpPath, const std::string& freezeDumpPath) + { + shmLock(); + + memset(mShm->mStartup.mCrashDumpFilePath, 0, sizeof(mShm->mStartup.mCrashDumpFilePath)); + size_t length = crashDumpPath.length(); + if (length >= MAX_LONG_PATH) length = MAX_LONG_PATH - 1; + strncpy(mShm->mStartup.mCrashDumpFilePath, crashDumpPath.c_str(), length); + mShm->mStartup.mCrashDumpFilePath[length] = '\0'; + + memset(mShm->mStartup.mFreezeDumpFilePath, 0, sizeof(mShm->mStartup.mFreezeDumpFilePath)); + length = freezeDumpPath.length(); + if (length >= MAX_LONG_PATH) length = MAX_LONG_PATH - 1; + strncpy(mShm->mStartup.mFreezeDumpFilePath, freezeDumpPath.c_str(), length); + mShm->mStartup.mFreezeDumpFilePath[length] = '\0'; + + shmUnlock(); + } + void CrashCatcher::setupIpc() { SECURITY_ATTRIBUTES attributes; diff --git a/components/crashcatcher/windows_crashcatcher.hpp b/components/crashcatcher/windows_crashcatcher.hpp index 85b30f762f..ea9f8e7ede 100644 --- a/components/crashcatcher/windows_crashcatcher.hpp +++ b/components/crashcatcher/windows_crashcatcher.hpp @@ -27,10 +27,16 @@ namespace Crash class CrashCatcher final { public: + static CrashCatcher* instance() + { + return sInstance; + } CrashCatcher(int argc, char** argv, const std::string& crashDumpPath, const std::string& freezeDumpPath); ~CrashCatcher(); + void updateDumpPaths(const std::string& crashDumpPath, const std::string& freezeDumpPath); + private: static CrashCatcher* sInstance; diff --git a/components/debug/debugging.cpp b/components/debug/debugging.cpp index 811ae9bf8e..2409c79c58 100644 --- a/components/debug/debugging.cpp +++ b/components/debug/debugging.cpp @@ -296,6 +296,16 @@ void setupLogging(const std::string& logDir, std::string_view appName) std::cout.rdbuf(&coutsb); std::cerr.rdbuf(&cerrsb); #endif + +#ifdef _WIN32 + if (Crash::CrashCatcher::instance()) + { + const std::string crashDumpName = Misc::StringUtils::lowerCase(appName) + "-crash.dmp"; + const std::string freezeDumpName = Misc::StringUtils::lowerCase(appName) + "-freeze.dmp"; + boost::filesystem::path dumpDirectory(logDir); + Crash::CrashCatcher::instance()->updateDumpPaths((dumpDirectory / crashDumpName).make_preferred().string(), (dumpDirectory / freezeDumpName).make_preferred().string()); + } +#endif } int wrapApplication(int (*innerApplication)(int argc, char *argv[]), int argc, char *argv[],