Index: lldb/bindings/interface/SBModule.i =================================================================== --- lldb/bindings/interface/SBModule.i +++ 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 Index: lldb/include/lldb/API/SBModule.h =================================================================== --- lldb/include/lldb/API/SBModule.h +++ 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; Index: lldb/packages/Python/lldbsuite/test/lldbtest.py =================================================================== --- lldb/packages/Python/lldbsuite/test/lldbtest.py +++ lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -2022,6 +2022,14 @@ 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. + self.assertEqual(self.dbg.GetNumTargets(), 0) + # Assert that the global module cache is empty. + self.assertEqual(lldb.SBModule.GetNumberAllocatedModules(), 0) + # Do this last, to make sure it's in reverse order from how we setup. Base.tearDown(self) Index: lldb/source/API/SBModule.cpp =================================================================== --- lldb/source/API/SBModule.cpp +++ 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, + ()); } }