From 7c58c9a23dbd74af34fe975cea0f4796af7f6bdc Mon Sep 17 00:00:00 2001 From: Kah Wei Date: Thu, 24 Nov 2022 22:56:55 +0800 Subject: [PATCH] Fixed crash caused when building scripts in debug mode when a debugger is attached --- SHADE_Engine/src/Scripting/SHScriptEngine.cpp | 23 +++++++++++++++++-- SHADE_Engine/src/Scripting/SHScriptEngine.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp index 90121994..3746d1d0 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.cpp +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.cpp @@ -197,12 +197,18 @@ namespace SHADE if (BUILD_SUCCESS) { // Copy to built dll to the working directory and replace - std::filesystem::copy_file("./tmp/SHADE_Scripting.dll", "SHADE_Scripting.dll", std::filesystem::copy_options::overwrite_existing); + if (!copyFile("./tmp/SHADE_Scripting.dll", "SHADE_Scripting.dll", std::filesystem::copy_options::overwrite_existing)) + { + SHLOG_ERROR("[ScriptEngine] Failed to replace scripts assembly. Scripts will remain outdated."); + } // If debug, we want to copy the PDB so that we can do script debugging if (debug) { - std::filesystem::copy_file("./tmp/SHADE_Scripting.pdb", "SHADE_Scripting.pdb", std::filesystem::copy_options::overwrite_existing); + if (!copyFile("./tmp/SHADE_Scripting.pdb", "SHADE_Scripting.pdb", std::filesystem::copy_options::overwrite_existing)) + { + SHLOG_WARNING("[ScriptEngine] Breakpoint debugging will not work as PDB cannot be updated. If you are currently debugging, stop the debugger first."); + } } oss << "[ScriptEngine] Successfully built Managed Script Assembly (" << MANAGED_SCRIPT_LIB_NAME << ")!"; @@ -591,6 +597,19 @@ namespace SHADE return false; } + bool SHScriptEngine::copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept + { + try + { + return std::filesystem::copy_file(from, to, options); + } + catch (std::exception& e) + { + SHLOG_ERROR("[ScriptEngine] Failed to copy file {} ({})", to.string(), std::string(e.what())); + return false; + } + } + DWORD SHScriptEngine::execProcess(const std::wstring& path, const std::wstring& args) { STARTUPINFOW startInfo; diff --git a/SHADE_Engine/src/Scripting/SHScriptEngine.h b/SHADE_Engine/src/Scripting/SHScriptEngine.h index ef778627..1a38a678 100644 --- a/SHADE_Engine/src/Scripting/SHScriptEngine.h +++ b/SHADE_Engine/src/Scripting/SHScriptEngine.h @@ -319,6 +319,7 @@ namespace SHADE /// File path to the file to check. /// True if the file exists static bool fileExists(const std::filesystem::path& filePath); + static bool copyFile(const std::filesystem::path& from, const std::filesystem::path& to, const std::filesystem::copy_options options) noexcept; static DWORD execProcess(const std::wstring& path, const std::wstring& args); static std::wstring generateBuildCommand(bool debug); };