import lldb from lldbsuite.test.decorators import * from lldbsuite.test.lldbtest import * from lldbsuite.test import lldbutil import gc import os class ReplaceDllTestCase(TestBase): @skipUnlessWindows def test(self): """ Test that LLDB unlocks module files once all references are released. """ exe = self.getBuildArtifact("a.out") foo = self.getBuildArtifact("foo.dll") bar = self.getBuildArtifact("bar.dll") self.build( dictionary={ "DYLIB_NAME": "foo", "DYLIB_C_SOURCES": "foo.c", "C_SOURCES": "test.c", } ) self.build( dictionary={ "DYLIB_ONLY": "YES", "DYLIB_NAME": "bar", "DYLIB_C_SOURCES": "bar.c", } ) target = self.dbg.CreateTarget(exe) self.assertTrue(target, VALID_TARGET) shlib_names = ["foo"] environment = self.registerSharedLibrariesWithTarget(target, shlib_names) process = target.LaunchSimple( None, environment, self.get_process_working_directory() ) self.assertEqual(process.GetExitStatus(), 42) module = next((m for m in target.modules if "foo" in m.file.basename), None) self.assertIsNotNone(module) self.assertEqual(module.file.fullpath, foo) target.RemoveModule(module) del module gc.collect() self.dbg.MemoryPressureDetected() os.remove(foo) os.rename(bar, foo) process = target.LaunchSimple( None, environment, self.get_process_working_directory() ) self.assertEqual(process.GetExitStatus(), 43)