teemperor created this revision. teemperor added reviewers: JDevlieghere, labath, LLDB.
Right now the only places in the SB API where lldb:: ModuleSP instances are destroyed are in SBDebugger::MemoryPressureDetected (where it's just attempted but not guaranteed) and in SBDebugger::DeleteTarget. Tests that directly create an lldb::ModuleSP and never create a target therefore currently leak lldb::Module instances. This triggers the sanity checks in lldbtest that make sure that the global module list is empty after a test. This patch makes that also SBDebugger::Destroy is cleaning orphaned lldb:: ModuleSP instances. It also moves that sanity check behind the SBDebugger::Destroy in our test suite to make this work. This fixes TestUnicodeSymbols.py when D83865 <https://reviews.llvm.org/D83865> is applied (which makes that the sanity checks actually fail the test). Repository: rLLDB LLDB https://reviews.llvm.org/D83876 Files: lldb/packages/Python/lldbsuite/test/lldbtest.py lldb/source/Core/Debugger.cpp Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -600,10 +600,14 @@ for (pos = g_debugger_list_ptr->begin(); pos != end; ++pos) { if ((*pos).get() == debugger_sp.get()) { g_debugger_list_ptr->erase(pos); - return; + break; } } } + + // Clean any modules that are orphaned. + bool mandatory = true; + ModuleList::RemoveOrphanSharedModules(mandatory); } DebuggerSP Debugger::FindDebuggerWithInstanceName(ConstString instance_name) { Index: lldb/packages/Python/lldbsuite/test/lldbtest.py =================================================================== --- lldb/packages/Python/lldbsuite/test/lldbtest.py +++ lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -1058,6 +1058,13 @@ lldb.SBDebugger.Destroy(self.dbg) del self.dbg + # Modules are not orphaned during reproducer replay because they're + # leaked on purpose. + if not configuration.is_reproducer(): + # Assert that the global module cache is empty. + self.assertEqual(lldb.SBModule.GetNumberAllocatedModules(), 0) + + # ========================================================= # Various callbacks to allow introspection of test progress # ========================================================= @@ -2021,13 +2028,9 @@ for target in targets: self.dbg.DeleteTarget(target) - # Modules are not orphaned during reproducer replay because they're - # leaked on purpose. if not configuration.is_reproducer(): # Assert that all targets are deleted. - assert self.dbg.GetNumTargets() == 0 - # Assert that the global module cache is empty. - assert lldb.SBModule.GetNumberAllocatedModules() == 0 + self.assertEqual(self.dbg.GetNumTargets(), 0) # Do this last, to make sure it's in reverse order from how we setup. Base.tearDown(self)
Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -600,10 +600,14 @@ for (pos = g_debugger_list_ptr->begin(); pos != end; ++pos) { if ((*pos).get() == debugger_sp.get()) { g_debugger_list_ptr->erase(pos); - return; + break; } } } + + // Clean any modules that are orphaned. + bool mandatory = true; + ModuleList::RemoveOrphanSharedModules(mandatory); } DebuggerSP Debugger::FindDebuggerWithInstanceName(ConstString instance_name) { Index: lldb/packages/Python/lldbsuite/test/lldbtest.py =================================================================== --- lldb/packages/Python/lldbsuite/test/lldbtest.py +++ lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -1058,6 +1058,13 @@ lldb.SBDebugger.Destroy(self.dbg) del self.dbg + # Modules are not orphaned during reproducer replay because they're + # leaked on purpose. + if not configuration.is_reproducer(): + # Assert that the global module cache is empty. + self.assertEqual(lldb.SBModule.GetNumberAllocatedModules(), 0) + + # ========================================================= # Various callbacks to allow introspection of test progress # ========================================================= @@ -2021,13 +2028,9 @@ for target in targets: self.dbg.DeleteTarget(target) - # Modules are not orphaned during reproducer replay because they're - # leaked on purpose. if not configuration.is_reproducer(): # Assert that all targets are deleted. - assert self.dbg.GetNumTargets() == 0 - # Assert that the global module cache is empty. - assert lldb.SBModule.GetNumberAllocatedModules() == 0 + self.assertEqual(self.dbg.GetNumTargets(), 0) # Do this last, to make sure it's in reverse order from how we setup. Base.tearDown(self)
_______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits