summaryrefslogtreecommitdiff
path: root/lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py
diff options
context:
space:
mode:
authorMed Ismail Bennani <medismail.bennani@gmail.com>2022-03-04 11:22:32 -0800
committerMed Ismail Bennani <medismail.bennani@gmail.com>2022-03-04 13:35:28 -0800
commit680ca7f21a7716698227966a9e70e7efb75cff7e (patch)
tree6435326ac817a69e0346c0f1a969a59003f9c6be /lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py
parent6eddd987c9c9d2ab76ed53eea452b34145992ed9 (diff)
[lldb/Plugins] Add ability to load modules to Scripted Processes
This patch introduces a new way to load modules programatically with Scripted Processes. To do so, the scripted process blueprint holds a list of dictionary describing the modules to load, which their path or uuid, load address and eventually a slide offset. LLDB will fetch that list after launching the ScriptedProcess, and iterate over each entry to create the module that will be loaded in the Scripted Process' target. The patch also refactors the StackCoreScriptedProcess test to stop inside the `libbaz` module and make sure it's loaded correctly and that we can fetch some variables from it. rdar://74520238 Differential Revision: https://reviews.llvm.org/D120969 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
Diffstat (limited to 'lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py')
-rw-r--r--lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py41
1 files changed, 28 insertions, 13 deletions
diff --git a/lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py b/lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py
index 3f4222fe3b79..b24648e80f1d 100644
--- a/lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py
+++ b/lldb/test/API/functionalities/scripted_process/TestStackCoreScriptedProcess.py
@@ -25,13 +25,19 @@ class StackCoreScriptedProcesTestCase(TestBase):
def create_stack_skinny_corefile(self, file):
self.build()
target, process, thread, _ = lldbutil.run_to_source_breakpoint(self, "// break here",
- lldb.SBFileSpec("main.cpp"))
+ lldb.SBFileSpec("baz.c"))
self.assertTrue(process.IsValid(), "Process is invalid.")
# FIXME: Use SBAPI to save the process corefile.
self.runCmd("process save-core -s stack " + file)
self.assertTrue(os.path.exists(file), "No stack-only corefile found.")
self.assertTrue(self.dbg.DeleteTarget(target), "Couldn't delete target")
+ def get_module_with_name(self, target, name):
+ for module in target.modules:
+ if name in module.GetFileSpec().GetFilename():
+ return module
+ return None
+
@skipUnlessDarwin
@skipIfOutOfTreeDebugserver
def test_launch_scripted_process_stack_frames(self):
@@ -41,15 +47,15 @@ class StackCoreScriptedProcesTestCase(TestBase):
target = self.dbg.CreateTarget(self.getBuildArtifact("a.out"))
self.assertTrue(target, VALID_TARGET)
- for module in target.modules:
- if 'a.out' in module.GetFileSpec().GetFilename():
- main_module = module
- break
-
+ main_module = self.get_module_with_name(target, 'a.out')
self.assertTrue(main_module, "Invalid main module.")
error = target.SetModuleLoadAddress(main_module, 0)
self.assertSuccess(error, "Reloading main module at offset 0 failed.")
+ scripted_dylib = self.get_module_with_name(target, 'libbaz.dylib')
+ self.assertTrue(scripted_dylib, "Dynamic library libbaz.dylib not found.")
+ self.assertEqual(scripted_dylib.GetObjectFileHeaderAddress().GetLoadAddress(target), 0xffffffffffffffff)
+
os.environ['SKIP_SCRIPTED_PROCESS_LAUNCH'] = '1'
def cleanup():
del os.environ["SKIP_SCRIPTED_PROCESS_LAUNCH"]
@@ -68,7 +74,8 @@ class StackCoreScriptedProcesTestCase(TestBase):
structured_data = lldb.SBStructuredData()
structured_data.SetFromJSON(json.dumps({
- "backing_target_idx" : self.dbg.GetIndexOfTarget(corefile_process.GetTarget())
+ "backing_target_idx" : self.dbg.GetIndexOfTarget(corefile_process.GetTarget()),
+ "libbaz_path" : self.getBuildArtifact("libbaz.dylib")
}))
launch_info = lldb.SBLaunchInfo(None)
launch_info.SetProcessPluginName("ScriptedProcess")
@@ -81,10 +88,10 @@ class StackCoreScriptedProcesTestCase(TestBase):
self.assertTrue(process, PROCESS_IS_VALID)
self.assertEqual(process.GetProcessID(), 42)
- self.assertEqual(process.GetNumThreads(), 3)
+ self.assertEqual(process.GetNumThreads(), 2)
thread = process.GetSelectedThread()
self.assertTrue(thread, "Invalid thread.")
- self.assertEqual(thread.GetName(), "StackCoreScriptedThread.thread-2")
+ self.assertEqual(thread.GetName(), "StackCoreScriptedThread.thread-1")
self.assertTrue(target.triple, "Invalid target triple")
arch = target.triple.split('-')[0]
@@ -102,9 +109,17 @@ class StackCoreScriptedProcesTestCase(TestBase):
else:
self.assertTrue(thread.GetStopReason(), lldb.eStopReasonSignal)
- self.assertEqual(thread.GetNumFrames(), 6)
+ self.assertEqual(thread.GetNumFrames(), 5)
frame = thread.GetSelectedFrame()
self.assertTrue(frame, "Invalid frame.")
- self.assertIn("bar", frame.GetFunctionName())
- self.assertEqual(int(frame.FindValue("i", lldb.eValueTypeVariableArgument).GetValue()), 42)
- self.assertEqual(int(frame.FindValue("j", lldb.eValueTypeVariableLocal).GetValue()), 42 * 42)
+ func = frame.GetFunction()
+ self.assertTrue(func, "Invalid function.")
+
+ self.assertIn("baz", frame.GetFunctionName())
+ self.assertEqual(frame.vars.GetSize(), 2)
+ self.assertEqual(int(frame.vars.GetFirstValueByName('j').GetValue()), 42 * 42)
+ self.assertEqual(int(frame.vars.GetFirstValueByName('k').GetValue()), 42)
+
+ scripted_dylib = self.get_module_with_name(target, 'libbaz.dylib')
+ self.assertTrue(scripted_dylib, "Dynamic library libbaz.dylib not found.")
+ self.assertEqual(scripted_dylib.GetObjectFileHeaderAddress().GetLoadAddress(target), 0x1001e0000)