From d49f252f4d031924ff1910dc6c3f8fe9ddca5538 Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Sat, 8 Apr 2023 16:09:23 +0200 Subject: [PATCH] Write minidump and slight code improvements * Write minidumps to disk when the game crashes. * Initialize global process timestamp as early as possible and separate from log dir. --- r5dev/core/logdef.cpp | 18 +++++++++--------- r5dev/core/logdef.h | 2 +- r5dev/core/stdafx.h | 3 +++ r5dev/tier0/crashhandler.cpp | 30 ++++++++++++++++++++++++++---- r5dev/vproj/clientsdk.vcxproj | 6 +++--- r5dev/vproj/dedicated.vcxproj | 6 +++--- r5dev/vproj/gamesdk.vcxproj | 6 +++--- r5dev/vproj/pluginsdk.vcxproj | 6 +++--- 8 files changed, 51 insertions(+), 26 deletions(-) diff --git a/r5dev/core/logdef.cpp b/r5dev/core/logdef.cpp index ec0b2528..90894482 100644 --- a/r5dev/core/logdef.cpp +++ b/r5dev/core/logdef.cpp @@ -18,7 +18,7 @@ void SpdLog_Init(void) } #ifndef NETCONSOLE - g_svLogSessionDirectory = fmt::format("platform\\logs\\{:s}\\", CreateTimedFileName()); + g_LogSessionDirectory = fmt::format("platform\\logs\\{:s}", g_ProcessTimestamp); /************************ * IMGUI LOGGER SETUP * ************************/ @@ -67,23 +67,23 @@ void SpdLog_Create() * ROTATE LOGGER SETUP * ************************/ spdlog::rotating_logger_mt("squirrel_re(warning)" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "script_warning.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "script_warning.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); spdlog::rotating_logger_mt("squirrel_re" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "script.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "script.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); spdlog::rotating_logger_mt("sdk" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "message.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "message.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); spdlog::rotating_logger_mt("sdk(warning)" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "warning.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "warning.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); spdlog::rotating_logger_mt("sdk(error)" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "error.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "error.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); spdlog::rotating_logger_mt("net_trace" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "net_trace.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "net_trace.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); #ifndef DEDICATED spdlog::rotating_logger_mt("netconsole" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "netconsole.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "netconsole.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); #endif // !DEDICATED spdlog::rotating_logger_mt("filesystem" - , fmt::format("{:s}{:s}", g_svLogSessionDirectory, "filesystem.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); + , fmt::format("{:s}\\{:s}", g_LogSessionDirectory, "filesystem.log"), SPDLOG_MAX_SIZE, SPDLOG_NUM_FILE)->set_pattern("[%Y-%m-%d %H:%M:%S.%e] %v"); } //############################################################################# diff --git a/r5dev/core/logdef.h b/r5dev/core/logdef.h index b1a88f3c..a499007f 100644 --- a/r5dev/core/logdef.h +++ b/r5dev/core/logdef.h @@ -6,7 +6,7 @@ constexpr int SPDLOG_NUM_FILE = 512; // Sets number of files to rotate to. inline bool g_bSpdLog_UseAnsiClr = false; inline bool g_bSpdLog_PostInit = false; -inline string g_svLogSessionDirectory; +inline string g_LogSessionDirectory; extern std::shared_ptr g_TermLogger; extern std::shared_ptr g_ImGuiLogger; diff --git a/r5dev/core/stdafx.h b/r5dev/core/stdafx.h index 77b4695a..83ffd239 100644 --- a/r5dev/core/stdafx.h +++ b/r5dev/core/stdafx.h @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -117,6 +118,8 @@ #include "tier0/dbg.h" #endif // !SDKLAUNCHER && !NETCONSOLE && !PLUGINSDK +inline string g_ProcessTimestamp = CreateTimedFileName(); + #if !defined(SDKLAUNCHER) && !defined (NETCONSOLE) && !defined(PLUGINSDK) #if !defined (DEDICATED) inline CModule g_GameDll = CModule("r5apex.exe"); diff --git a/r5dev/tier0/crashhandler.cpp b/r5dev/tier0/crashhandler.cpp index 6fbddc9a..1fba8562 100644 --- a/r5dev/tier0/crashhandler.cpp +++ b/r5dev/tier0/crashhandler.cpp @@ -475,14 +475,36 @@ bool CCrashHandler::HasWhitelist() } //----------------------------------------------------------------------------- -// Purpose: writes the formatted exception buffer to a file on the disk +// Purpose: writes the stack trace and minidump to the disk //----------------------------------------------------------------------------- void CCrashHandler::WriteFile() { - string logDirectory = Format("%s%s", g_svLogSessionDirectory.c_str(), "apex_crash.txt"); - CIOStream logFile(logDirectory, CIOStream::Mode_t::WRITE); + const string logDirectory = Format("%s\\%s.txt", g_LogSessionDirectory.c_str(), "apex_crash"); + CIOStream logFile; - logFile.WriteString(m_svBuffer); + if (logFile.Open(logDirectory, CIOStream::Mode_t::WRITE)) + { + logFile.WriteString(m_svBuffer); + } + + const string dmpDirectory = Format("%s\\%s.dmp", g_LogSessionDirectory.c_str(), "minidump"); + HANDLE hDmpFile = CreateFileA(dmpDirectory.c_str(), GENERIC_WRITE, 0, 0, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, 0); + + if (hDmpFile != INVALID_HANDLE_VALUE) + { + MINIDUMP_EXCEPTION_INFORMATION dumpExceptionInfo; + dumpExceptionInfo.ThreadId = GetCurrentThreadId(); + dumpExceptionInfo.ExceptionPointers = m_pExceptionPointers; + dumpExceptionInfo.ClientPointers = false; + + MiniDumpWriteDump( + GetCurrentProcess(), + GetCurrentProcessId(), + hDmpFile, MiniDumpNormal, + &dumpExceptionInfo, NULL, NULL); + + CloseHandle(hDmpFile); + } } //----------------------------------------------------------------------------- diff --git a/r5dev/vproj/clientsdk.vcxproj b/r5dev/vproj/clientsdk.vcxproj index 957d56fb..b9abac33 100644 --- a/r5dev/vproj/clientsdk.vcxproj +++ b/r5dev/vproj/clientsdk.vcxproj @@ -637,7 +637,7 @@ true false ..\ClientSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ 8000000 @@ -681,7 +681,7 @@ true false ..\ClientSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ true 8000000 @@ -733,7 +733,7 @@ true false ..\ClientSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ diff --git a/r5dev/vproj/dedicated.vcxproj b/r5dev/vproj/dedicated.vcxproj index f82f7121..98de0dba 100644 --- a/r5dev/vproj/dedicated.vcxproj +++ b/r5dev/vproj/dedicated.vcxproj @@ -99,7 +99,7 @@ Console true - advapi32.lib;bcrypt.lib;crypt32.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ ..\Dedicated.def 8000000 @@ -135,7 +135,7 @@ Console true - advapi32.lib;bcrypt.lib;crypt32.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ ..\Dedicated.def true @@ -180,7 +180,7 @@ true - advapi32.lib;bcrypt.lib;crypt32.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;user32.lib;wldap32.lib;ws2_32.lib;libcurl_x64.lib;libdetours_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ ..\Dedicated.def diff --git a/r5dev/vproj/gamesdk.vcxproj b/r5dev/vproj/gamesdk.vcxproj index 67fcdd42..f10941bf 100644 --- a/r5dev/vproj/gamesdk.vcxproj +++ b/r5dev/vproj/gamesdk.vcxproj @@ -691,7 +691,7 @@ true false ..\GameSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ 8000000 @@ -735,7 +735,7 @@ true false ..\GameSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ true 8000000 @@ -787,7 +787,7 @@ true false ..\GameSDK.def - advapi32.lib;bcrypt.lib;crypt32.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) + advapi32.lib;bcrypt.lib;crypt32.lib;dbghelp.lib;d3d11.lib;wldap32.lib;ws2_32.lib;libdetours_x64.lib;libcurl_x64.lib;libimgui_x64.lib;liblzham_x64.lib;libprotobuf_x64.lib;librecast_x64.lib;libdtdetour_x64.lib;libspdlog_x64.lib;%(AdditionalDependencies) $(SolutionDir)lib\$(Configuration)\ diff --git a/r5dev/vproj/pluginsdk.vcxproj b/r5dev/vproj/pluginsdk.vcxproj index e7af0510..b836b541 100644 --- a/r5dev/vproj/pluginsdk.vcxproj +++ b/r5dev/vproj/pluginsdk.vcxproj @@ -100,7 +100,7 @@ true $(SolutionDir)lib\$(Configuration)\ 8000000 - libspdlog_x64.lib;%(AdditionalDependencies) + dbghelp.lib;libspdlog_x64.lib;%(AdditionalDependencies) IF EXIST "$(SolutionDir)..\..\r5apexdata.bin" del "$(SolutionDir)..\..\bin\x64_plugins\pluginsdk_x64.dll" && copy /Y "$(TargetPath)" "$(SolutionDir)..\..\bin\x64_plugins @@ -130,7 +130,7 @@ true $(SolutionDir)lib\$(Configuration)\ 8000000 - libspdlog_x64.lib;%(AdditionalDependencies) + dbghelp.lib;libspdlog_x64.lib;%(AdditionalDependencies) true true @@ -169,7 +169,7 @@ 8000000 - libspdlog_x64.lib;%(AdditionalDependencies) + dbghelp.lib;libspdlog_x64.lib;%(AdditionalDependencies) IF EXIST "$(SolutionDir)..\..\r5apexdata.bin" del "$(SolutionDir)..\..\bin\x64_plugins\pluginsdk_x64.dll" && copy /Y "$(TargetPath)" "$(SolutionDir)..\..\bin\x64_plugins