diff --git a/Prism/src/Prism/Scene/SceneSerializer.cpp b/Prism/src/Prism/Scene/SceneSerializer.cpp index 6edc4ca..a7c426f 100644 --- a/Prism/src/Prism/Scene/SceneSerializer.cpp +++ b/Prism/src/Prism/Scene/SceneSerializer.cpp @@ -17,7 +17,6 @@ #include #include -#include #include #include "Prism/Physics/PxPhysicsWrappers.h" diff --git a/Prism/src/Prism/Script/ScriptEngine.cpp b/Prism/src/Prism/Script/ScriptEngine.cpp index 87ca3fa..89f586b 100644 --- a/Prism/src/Prism/Script/ScriptEngine.cpp +++ b/Prism/src/Prism/Script/ScriptEngine.cpp @@ -17,6 +17,8 @@ #include #include #include +#include +#include #include "imgui.h" @@ -35,6 +37,12 @@ namespace Prism MonoImage* s_AppAssemblyImage = nullptr; MonoImage* s_CoreAssemblyImage = nullptr; +#ifdef ENABLE_MONO_DEBUG + static bool s_EnableMonoPDBDebug = true; +#else + static bool s_EnableMonoPDBDebug = false; +#endif + static MonoMethod* GetMethod(MonoImage* image, const std::string& methodDesc); @@ -86,22 +94,16 @@ namespace Prism } std::ifstream file(filepath, std::ios::binary | std::ios::ate); - if (!file.is_open()) { - return nullptr; - } + if (!file.is_open()) { return nullptr;} std::streamsize size = file.tellg(); - if (size <= 0) { - return nullptr; - } + if (size <= 0) { return nullptr; } file.seekg(0, std::ios::beg); std::vector buffer(size); - if (!file.read(buffer.data(), size)) { - return nullptr; - } + if (!file.read(buffer.data(), size)) { return nullptr;} MonoImageOpenStatus status; @@ -117,6 +119,36 @@ namespace Prism return nullptr; } + if (s_EnableMonoPDBDebug) + { + PM_CORE_INFO("loading pdb file..."); + std::filesystem::path pdbPath(filepath); + pdbPath.replace_extension(".pdb"); + + if (std::ifstream pdbfile(pdbPath, std::ios::binary | std::ios::ate); pdbfile.is_open()) + { + std::streamsize pdbfileSize = pdbfile.tellg(); + if (pdbfileSize > 0) + { + pdbfile.seekg(0, std::ios::beg); + + std::vector pdbData(pdbfileSize); + if (pdbfile.read(pdbData.data(), pdbfileSize)) + { + mono_debug_open_image_from_memory(image, reinterpret_cast(pdbData.data()), static_cast(pdbfileSize)); + PM_CORE_INFO("loaded pdb file: {0}", pdbPath.string()); + PM_CORE_INFO(" size: {0}", pdbfileSize); + } + } + } + else + { + PM_CORE_INFO("pdb file not found, skiped"); + } + } + + + const auto assembly = mono_assembly_load_from_full(image, filepath, &status, 0); mono_image_close(image); @@ -128,7 +160,18 @@ namespace Prism { mono_set_dirs("library/mono/net8.0", ""); mono_set_assemblies_path("library/mono/net8.0"); - // mono_jit_set_trace_options("--verbose"); + + if (s_EnableMonoPDBDebug) + { + const char* argv[2] + { + "--debugger-agent=transport=dt_socket,address=127.0.0.1:2550,server=y,suspend=n,loglevel=3,logfile=MonoDebugger.log", + "--soft-breakpoints" + }; + + mono_jit_parse_options(2, (char**)argv); + mono_debug_init(MONO_DEBUG_FORMAT_MONO); + } auto domain = mono_jit_init("Prism");