diff --git a/lldb/include/lldb/Core/ModuleList.h b/lldb/include/lldb/Core/ModuleList.h index 6ecdcf10fa85f..a6f0600ece876 100644 --- a/lldb/include/lldb/Core/ModuleList.h +++ b/lldb/include/lldb/Core/ModuleList.h @@ -489,7 +489,7 @@ class ModuleList { static size_t RemoveOrphanSharedModules(bool mandatory); - static bool RemoveSharedModuleIfOrphaned(const Module *module_ptr); + static bool RemoveSharedModuleIfOrphaned(const lldb::ModuleWP module_ptr); /// Applies 'callback' to each module in this ModuleList. /// If 'callback' returns false, iteration terminates. diff --git a/lldb/source/Core/ModuleList.cpp b/lldb/source/Core/ModuleList.cpp index 060732f421f88..68d68f921ebf0 100644 --- a/lldb/source/Core/ModuleList.cpp +++ b/lldb/source/Core/ModuleList.cpp @@ -1279,7 +1279,16 @@ bool ModuleList::RemoveSharedModule(lldb::ModuleSP &module_sp) { return GetSharedModuleList().Remove(module_sp); } -bool ModuleList::RemoveSharedModuleIfOrphaned(const Module *module_ptr) { +bool ModuleList::RemoveSharedModuleIfOrphaned(const ModuleWP module_wp) { + // Get the module pointer if the shared pointer is still valid, + // but be careful to call RemoveIfOrphaned after the shared pointer + // is out of scope, otherwise the use count would be incremented by one and + // RemoveIfOrphaned would never identify the module as an orphan. + Module *module_ptr = nullptr; + if (ModuleSP module_sp = module_wp.lock()) + module_ptr = module_sp.get(); + else + return false; return GetSharedModuleList().RemoveIfOrphaned(module_ptr); } diff --git a/lldb/source/Target/Target.cpp b/lldb/source/Target/Target.cpp index fa98c24606492..214849b2cd502 100644 --- a/lldb/source/Target/Target.cpp +++ b/lldb/source/Target/Target.cpp @@ -2564,9 +2564,9 @@ ModuleSP Target::GetOrCreateModule(const ModuleSpec &orig_module_spec, m_images.Append(module_sp, notify); for (ModuleSP &old_module_sp : replaced_modules) { - Module *old_module_ptr = old_module_sp.get(); + auto old_module_wp = old_module_sp->weak_from_this(); old_module_sp.reset(); - ModuleList::RemoveSharedModuleIfOrphaned(old_module_ptr); + ModuleList::RemoveSharedModuleIfOrphaned(old_module_wp); } } else module_sp.reset();