103 lines · python
1"""Test the SBDModule APIs."""2 3import lldb4from lldbsuite.test.decorators import *5from lldbsuite.test.lldbtest import *6from lldbsuite.test import lldbutil7 8import os, signal, subprocess9 10 11class SBModuleAPICase(TestBase):12 def setUp(self):13 TestBase.setUp(self)14 self.background_pid = None15 16 def tearDown(self):17 TestBase.tearDown(self)18 if self.background_pid:19 os.kill(self.background_pid, signal.SIGKILL)20 21 @skipIfRemote22 def test_GetObjectName(self):23 """Test the SBModule::GetObjectName() method"""24 self.build()25 exe = self.getBuildArtifact("a.out")26 libfoo_path = self.getBuildArtifact("libfoo.a")27 target_exe = self.dbg.CreateTarget(exe)28 self.assertTrue(target_exe.IsValid(), "Target for a.out is valid")29 30 # Test that the executable module has no object name (usually the first module in the target)31 exe_module = target_exe.GetModuleAtIndex(0)32 self.assertTrue(exe_module.IsValid(), "Executable module is valid")33 self.assertIsNone(34 exe_module.GetObjectName(), "a.out should have no object name"35 )36 37 # check archive member names38 module_specs = lldb.SBModuleSpecList.GetModuleSpecifications(libfoo_path)39 self.assertGreater(40 module_specs.GetSize(), 0, "Archive should have at least one module spec"41 )42 found = set()43 expected = {"a.o", "b.o"}44 for i in range(module_specs.GetSize()):45 spec = module_specs.GetSpecAtIndex(i)46 obj_name = spec.GetObjectName()47 self.assertIsInstance(obj_name, str)48 self.assertIn(obj_name, expected, f"Unexpected object name: {obj_name}")49 # create a module from the arhive using the sepc50 module = lldb.SBModule(spec)51 self.assertTrue(module.IsValid(), "Module is valid")52 self.assertTrue(module.IsValid(), f"Module for {obj_name} is valid")53 self.assertEqual(54 module.GetObjectName(), obj_name, f"Object name for {obj_name} matches"55 )56 found.add(obj_name)57 58 self.assertEqual(found, expected, "Did not find all expected archive members")59 60 @skipUnlessDarwin61 @skipIfRemote62 def test_module_is_file_backed(self):63 """Test the SBModule::IsFileBacked() method"""64 self.build()65 target, _, _, _ = lldbutil.run_to_source_breakpoint(66 self, "// break here", lldb.SBFileSpec("main.c")67 )68 69 self.assertGreater(target.GetNumModules(), 0)70 main_module = target.GetModuleAtIndex(0)71 self.assertEqual(main_module.GetFileSpec().GetFilename(), "a.out")72 self.assertTrue(73 main_module.IsFileBacked(), "The module should be backed by a file on disk"74 )75 76 self.dbg.DeleteTarget(target)77 self.assertEqual(self.dbg.GetNumTargets(), 0)78 79 exe = self.getBuildArtifact("a.out")80 background_process = subprocess.Popen([exe])81 self.assertTrue(background_process, "process is not valid")82 self.background_pid = background_process.pid83 os.unlink(exe)84 85 target = self.dbg.CreateTarget("")86 self.assertEqual(self.dbg.GetNumTargets(), 1)87 error = lldb.SBError()88 process = target.AttachToProcessWithID(89 self.dbg.GetListener(), self.background_pid, error90 )91 self.assertTrue(error.Success() and process, PROCESS_IS_VALID)92 main_module = target.FindModule(lldb.SBFileSpec("a.out"))93 self.assertIsNotNone(main_module)94 self.assertFalse(95 main_module.IsFileBacked(),96 "The module should not be backed by a file on disk.",97 )98 99 error = process.Destroy()100 self.assertSuccess(101 error, "couldn't destroy process %s" % background_process.pid102 )103