Files
llvm/lldb/test/API/functionalities/scripted_process/TestScriptedProcess.py
Med Ismail Bennani 46796762af [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>
2021-03-01 21:13:32 +01:00

98 lines
3.9 KiB
Python

"""
Test python scripted process in lldb
"""
import os
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
from lldbsuite.test import lldbtest
class ScriptedProcesTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
def setUp(self):
TestBase.setUp(self)
self.source = "main.c"
def tearDown(self):
TestBase.tearDown(self)
def test_python_plugin_package(self):
"""Test that the lldb python module has a `plugins.scripted_process`
package."""
self.expect('script import lldb.plugins',
substrs=["ModuleNotFoundError"], matching=False)
self.expect('script dir(lldb.plugins)',
substrs=["scripted_process"])
self.expect('script import lldb.plugins.scripted_process',
substrs=["ModuleNotFoundError"], matching=False)
self.expect('script dir(lldb.plugins.scripted_process)',
substrs=["ScriptedProcess"])
self.expect('script from lldb.plugins.scripted_process import ScriptedProcess',
substrs=["ImportError"], matching=False)
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, 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)