diff --git a/lldb/bindings/interface/SBModule.i b/lldb/bindings/interface/SBModule.i --- a/lldb/bindings/interface/SBModule.i +++ b/lldb/bindings/interface/SBModule.i @@ -344,6 +344,15 @@ lldb::SBAddress GetObjectFileEntryPointAddress() const; + %feature("docstring", " + Returns the number of modules in the module cache. This is an + implementation detail exposed for testing and should not be relied upon. + + @return + The number of modules in the module cache.") GetNumberAllocatedModules; + static uint32_t + GetNumberAllocatedModules(); + STRING_EXTENSION(SBModule) #ifdef SWIGPYTHON diff --git a/lldb/include/lldb/API/SBModule.h b/lldb/include/lldb/API/SBModule.h --- a/lldb/include/lldb/API/SBModule.h +++ b/lldb/include/lldb/API/SBModule.h @@ -288,6 +288,9 @@ lldb::SBAddress GetObjectFileHeaderAddress() const; lldb::SBAddress GetObjectFileEntryPointAddress() const; + /// Get the number of global modules. + static uint32_t GetNumberAllocatedModules(); + private: friend class SBAddress; friend class SBFrame; diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -2018,10 +2018,18 @@ process = target.GetProcess() if process: rc = self.invoke(process, "Kill") - self.assertTrue(rc.Success(), PROCESS_KILLED) + assert rc.Success() 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 + # Do this last, to make sure it's in reverse order from how we setup. Base.tearDown(self) diff --git a/lldb/source/API/SBModule.cpp b/lldb/source/API/SBModule.cpp --- a/lldb/source/API/SBModule.cpp +++ b/lldb/source/API/SBModule.cpp @@ -683,6 +683,13 @@ return LLDB_RECORD_RESULT(sb_addr); } +uint32_t SBModule::GetNumberAllocatedModules() { + LLDB_RECORD_STATIC_METHOD_NO_ARGS(uint32_t, SBModule, + GetNumberAllocatedModules); + + return Module::GetNumberAllocatedModules(); +} + namespace lldb_private { namespace repro { @@ -757,6 +764,8 @@ GetObjectFileHeaderAddress, ()); LLDB_REGISTER_METHOD_CONST(lldb::SBAddress, SBModule, GetObjectFileEntryPointAddress, ()); + LLDB_REGISTER_STATIC_METHOD(uint32_t, SBModule, GetNumberAllocatedModules, + ()); } }