The two module retrieval methods (qXfer:libraries-svr4 and manual list traversal) differ in how the handle the manually-added-but-not-yet-loaded modules. The svr4 path will remove it, while the manual one will keep in the list. It's likely the two paths need ought to be synchronized, but right now, this distinction is not relevant for the test.
59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
class TestCase(TestBase):
|
|
|
|
mydir = TestBase.compute_mydir(__file__)
|
|
NO_DEBUG_INFO_TESTCASE = True
|
|
|
|
@skipIfRemote
|
|
def test_load_after_attach(self):
|
|
self.build()
|
|
|
|
ctx = self.platformContext
|
|
lib_name = ctx.shlib_prefix + 'lib_b.' + ctx.shlib_extension
|
|
|
|
exe = self.getBuildArtifact("a.out")
|
|
lib = self.getBuildArtifact(lib_name)
|
|
|
|
target = self.dbg.CreateTarget(exe)
|
|
environment = self.registerSharedLibrariesWithTarget(target, ["lib_b"])
|
|
|
|
# Spawn a new process.
|
|
# use realpath to workaround llvm.org/pr48376
|
|
# Pass path to solib for dlopen to properly locate the library.
|
|
popen = self.spawnSubprocess(os.path.realpath(exe), extra_env=environment)
|
|
|
|
# Attach to the spawned process.
|
|
error = lldb.SBError()
|
|
process = target.AttachToProcessWithID(self.dbg.GetListener(),
|
|
popen.pid, error)
|
|
self.assertSuccess(error)
|
|
|
|
# Continue until first breakpoint.
|
|
breakpoint1 = self.target().BreakpointCreateBySourceRegex(
|
|
"// break here", lldb.SBFileSpec("main.cpp"))
|
|
self.assertEqual(breakpoint1.GetNumResolvedLocations(), 1)
|
|
stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint1)
|
|
self.assertEqual(len(stopped_threads), 1)
|
|
|
|
# Change a variable to escape the loop
|
|
self.runCmd("expression main_thread_continue = 1")
|
|
|
|
# Continue so that dlopen is called.
|
|
breakpoint2 = self.target().BreakpointCreateBySourceRegex(
|
|
"// break after dlopen", lldb.SBFileSpec("main.cpp"))
|
|
self.assertEqual(breakpoint2.GetNumResolvedLocations(), 1)
|
|
stopped_threads = lldbutil.continue_to_breakpoint(self.process(), breakpoint2)
|
|
self.assertEqual(len(stopped_threads), 1)
|
|
|
|
# Check that image list contains liblib_b after dlopen.
|
|
self.match(
|
|
"image list",
|
|
patterns = [lib_name],
|
|
matching = True,
|
|
msg = lib_name + " missing in image list")
|
|
|