diff options
| author | Med Ismail Bennani <medismail.bennani@gmail.com> | 2021-03-24 15:11:51 +0000 |
|---|---|---|
| committer | Med Ismail Bennani <medismail.bennani@gmail.com> | 2021-03-24 19:10:58 +0100 |
| commit | b09d44b6ae0901865a0d4b2a0cf797c3cd34eeeb (patch) | |
| tree | a9ebf23c20b448e6e82f91ef59b898c0d84e5c5d /lldb/test/API/functionalities/scripted_process | |
| parent | 1818dc394f3172a44df07adf754110d7ecca5e13 (diff) | |
[lldb/Plugins] Add ScriptedProcess Process Plugin
This patch introduces Scripted Processes to lldb.
The goal, here, is to be able to attach in the debugger to fake processes
that are backed by script files (in Python, Lua, Swift, etc ...) and
inspect them statically.
Scripted Processes can be used in cooperative multithreading environments
like the XNU Kernel or other real-time operating systems, but it can
also help us improve the debugger testing infrastructure by writting
synthetic tests that simulates hard-to-reproduce process/thread states.
Although ScriptedProcess is not feature-complete at the moment, it has
basic execution capabilities and will improve in the following patches.
rdar://65508855
Differential Revision: https://reviews.llvm.org/D95713
Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
Diffstat (limited to 'lldb/test/API/functionalities/scripted_process')
| -rw-r--r-- | lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py | 54 |
1 files changed, 53 insertions, 1 deletions
diff --git a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py index a5da07027aaf..5cf49ab37791 100644 --- a/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py +++ b/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py @@ -11,7 +11,7 @@ from lldbsuite.test import lldbutil from lldbsuite.test import lldbtest -class PlatformProcessCrashInfoTestCase(TestBase): +class ScriptedProcesTestCase(TestBase): mydir = TestBase.compute_mydir(__file__) @@ -43,3 +43,55 @@ class PlatformProcessCrashInfoTestCase(TestBase): self.expect('script dir(ScriptedProcess)', substrs=["launch"]) + def test_launch_scripted_process_sbapi(self): + """Test that we can launch an lldb scripted process using the SBAPI, + check its process ID and read string from memory.""" + self.build() + target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) + self.assertTrue(target, VALID_TARGET) + + scripted_process_example_relpath = ['..','..','..','..','examples','python','scripted_process','my_scripted_process.py'] + os.environ['SKIP_SCRIPTED_PROCESS_LAUNCH'] = '1' + self.runCmd("command script import " + os.path.join(self.getSourceDir(), + *scripted_process_example_relpath)) + + launch_info = lldb.SBLaunchInfo(None) + launch_info.SetProcessPluginName("ScriptedProcess") + launch_info.SetScriptedProcessClassName("my_scripted_process.MyScriptedProcess") + + error = lldb.SBError() + process = target.Launch(launch_info, error) + self.assertTrue(process and process.IsValid(), PROCESS_IS_VALID) + self.assertEqual(process.GetProcessID(), 42) + + hello_world = "Hello, world!" + memory_read = process.ReadCStringFromMemory(0x50000000000, + len(hello_world) + 1, # NULL byte + error) + + self.assertTrue(error.Success(), "Failed to read memory from scripted process.") + self.assertEqual(hello_world, memory_read) + + def test_launch_scripted_process_cli(self): + """Test that we can launch an lldb scripted process from the command + line, check its process ID and read string from memory.""" + self.build() + target = self.dbg.CreateTarget(self.getBuildArtifact("a.out")) + self.assertTrue(target, VALID_TARGET) + + scripted_process_example_relpath = ['..','..','..','..','examples','python','scripted_process','my_scripted_process.py'] + self.runCmd("command script import " + os.path.join(self.getSourceDir(), + *scripted_process_example_relpath)) + + process = target.GetProcess() + self.assertTrue(process, PROCESS_IS_VALID) + self.assertEqual(process.GetProcessID(), 42) + + error = lldb.SBError() + hello_world = "Hello, world!" + memory_read = process.ReadCStringFromMemory(0x50000000000, + len(hello_world) + 1, # NULL byte + error) + + self.assertTrue(error.Success(), "Failed to read memory from scripted process.") + self.assertEqual(hello_world, memory_read) |
