https://github.com/medismailben created https://github.com/llvm/llvm-project/pull/70351
This patch is a follow-up to db223b7f01f7. Similarly to it, it changes the timing of binary image loading for the ProcessMachCore plugin. This issue came up after getting reports of scripting resources that would fail to execute because they relied on data provided by the corefile process (i.e. for reading memory). However, rior to this change, the scripting resource loading would happen as part of the binary image loading, which in turns happened before the process finished being created. This patch address that issue by delaying the binary image loading phase until we receive the corefile process stop event event, ensuring that the process is fully formed. >From 81ace8b87271098c3c9dd615d2dc401b9414ea37 Mon Sep 17 00:00:00 2001 From: Med Ismail Bennani <ism...@bennani.ma> Date: Thu, 26 Oct 2023 01:11:02 -0700 Subject: [PATCH] [lldb/Target] Delay image loading after corefile process creation This patch is a follow-up to db223b7f01f7. Similarly to it, it changes the timing of binary image loading for the ProcessMachCore plugin. This issue came up after getting reports of scripting resources that would fail to execute because they relied on data provided by the corefile process (i.e. for reading memory). However, rior to this change, the scripting resource loading would happen as part of the binary image loading, which in turns happened before the process finished being created. This patch address that issue by delaying the binary image loading phase until we receive the corefile process stop event event, ensuring that the process is fully formed. Signed-off-by: Med Ismail Bennani <ism...@bennani.ma> --- lldb/include/lldb/Target/Process.h | 2 ++ .../Process/mach-core/ProcessMachCore.cpp | 4 +-- .../Process/mach-core/ProcessMachCore.h | 2 ++ lldb/source/Target/Process.cpp | 29 ++++++++++--------- 4 files changed, 22 insertions(+), 15 deletions(-) diff --git a/lldb/include/lldb/Target/Process.h b/lldb/include/lldb/Target/Process.h index a6d3e6c2d16926e..e25e82302a56dd9 100644 --- a/lldb/include/lldb/Target/Process.h +++ b/lldb/include/lldb/Target/Process.h @@ -614,6 +614,8 @@ class Process : public std::enable_shared_from_this<Process>, return error; } + virtual void DidLoadCore() {} + /// The "ShadowListener" for a process is just an ordinary Listener that /// listens for all the Process event bits. It's convenient because you can /// specify it in the LaunchInfo or AttachInfo, so it will get events from diff --git a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp index b11062a0224abc2..9b10a0b832915d3 100644 --- a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp +++ b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp @@ -570,8 +570,6 @@ Status ProcessMachCore::DoLoadCore() { CreateMemoryRegions(); - LoadBinariesAndSetDYLD(); - CleanupMemoryRegionPermissions(); AddressableBits addressable_bits = core_objfile->GetAddressableBits(); @@ -580,6 +578,8 @@ Status ProcessMachCore::DoLoadCore() { return error; } +void ProcessMachCore::DidLoadCore() { LoadBinariesAndSetDYLD(); } + lldb_private::DynamicLoader *ProcessMachCore::GetDynamicLoader() { if (m_dyld_up.get() == nullptr) m_dyld_up.reset(DynamicLoader::FindPlugin(this, m_dyld_plugin_name)); diff --git a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h index c8820209e3f3830..0e61daa625b53cc 100644 --- a/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h +++ b/lldb/source/Plugins/Process/mach-core/ProcessMachCore.h @@ -46,6 +46,8 @@ class ProcessMachCore : public lldb_private::PostMortemProcess { // Creating a new process, or attaching to an existing one lldb_private::Status DoLoadCore() override; + void DidLoadCore() override; + lldb_private::DynamicLoader *GetDynamicLoader() override; // PluginInterface protocol diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index f82ab05362fbee9..f4bacf314dd746a 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -2639,19 +2639,6 @@ Status Process::LoadCore() { else StartPrivateStateThread(); - DynamicLoader *dyld = GetDynamicLoader(); - if (dyld) - dyld->DidAttach(); - - GetJITLoaders().DidAttach(); - - SystemRuntime *system_runtime = GetSystemRuntime(); - if (system_runtime) - system_runtime->DidAttach(); - - if (!m_os_up) - LoadOperatingSystemPlugin(false); - // We successfully loaded a core file, now pretend we stopped so we can // show all of the threads in the core file and explore the crashed state. SetPrivateState(eStateStopped); @@ -2668,7 +2655,23 @@ Status Process::LoadCore() { StateAsCString(state)); error.SetErrorString( "Did not get stopped event after loading the core file."); + } else { + DidLoadCore(); + + DynamicLoader *dyld = GetDynamicLoader(); + if (dyld) + dyld->DidAttach(); + + GetJITLoaders().DidAttach(); + + SystemRuntime *system_runtime = GetSystemRuntime(); + if (system_runtime) + system_runtime->DidAttach(); + + if (!m_os_up) + LoadOperatingSystemPlugin(false); } + RestoreProcessEvents(); } return error; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits