66 lines · python
1import lldb2from lldbsuite.test.decorators import *3from lldbsuite.test.lldbtest import *4from lldbsuite.test import lldbutil5 6 7class TestCase(TestBase):8 NO_DEBUG_INFO_TESTCASE = True9 10 @skipIfRemote11 def test_load_after_attach(self):12 self.build()13 14 sync_file_path = lldbutil.append_to_process_working_directory(15 self, "process_ready"16 )17 18 ctx = self.platformContext19 lib_name = ctx.shlib_prefix + "lib_b." + ctx.shlib_extension20 21 exe = self.getBuildArtifact("a.out")22 lib = self.getBuildArtifact(lib_name)23 24 target = self.dbg.CreateTarget(exe)25 environment = self.registerSharedLibrariesWithTarget(target, ["lib_b"])26 27 # Spawn a new process.28 # use realpath to workaround llvm.org/pr4837629 # Pass path to solib for dlopen to properly locate the library.30 popen = self.spawnSubprocess(31 os.path.realpath(exe), [sync_file_path], extra_env=environment32 )33 lldbutil.wait_for_file_on_target(self, sync_file_path)34 35 # Attach to the spawned process.36 error = lldb.SBError()37 process = target.AttachToProcessWithID(self.dbg.GetListener(), popen.pid, error)38 self.assertSuccess(error)39 40 # Continue until first breakpoint.41 breakpoint1 = self.target().BreakpointCreateBySourceRegex(42 "// break here", lldb.SBFileSpec("main.cpp")43 )44 self.assertEqual(breakpoint1.GetNumResolvedLocations(), 1)45 stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint1)46 self.assertEqual(len(stopped_threads), 1)47 48 # Change a variable to escape the loop49 self.runCmd("expression main_thread_continue = 1")50 51 # Continue so that dlopen is called.52 breakpoint2 = self.target().BreakpointCreateBySourceRegex(53 "// break after dlopen", lldb.SBFileSpec("main.cpp")54 )55 self.assertEqual(breakpoint2.GetNumResolvedLocations(), 1)56 stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint2)57 self.assertEqual(len(stopped_threads), 1)58 59 # Check that image list contains liblib_b after dlopen.60 self.match(61 "image list",62 patterns=[lib_name],63 matching=True,64 msg=lib_name + " missing in image list",65 )66