
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/D100384 Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
45 lines
1.4 KiB
Python
45 lines
1.4 KiB
Python
import os
|
|
|
|
import lldb
|
|
from lldb.plugins.scripted_process import ScriptedProcess
|
|
|
|
class MyScriptedProcess(ScriptedProcess):
|
|
def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData):
|
|
super().__init__(target, args)
|
|
|
|
def get_memory_region_containing_address(self, addr: int) -> lldb.SBMemoryRegionInfo:
|
|
return self.memory_regions[0]
|
|
|
|
def get_thread_with_id(self, tid: int):
|
|
return {}
|
|
|
|
def get_registers_for_thread(self, tid: int):
|
|
return {}
|
|
|
|
def read_memory_at_address(self, addr: int, size: int) -> lldb.SBData:
|
|
data = lldb.SBData().CreateDataFromCString(
|
|
self.target.GetByteOrder(),
|
|
self.target.GetCodeByteSize(),
|
|
"Hello, world!")
|
|
return data
|
|
|
|
def get_loaded_images(self):
|
|
return self.loaded_images
|
|
|
|
def get_process_id(self) -> int:
|
|
return 42
|
|
|
|
def should_stop(self) -> bool:
|
|
return True
|
|
|
|
def is_alive(self) -> bool:
|
|
return True
|
|
|
|
def __lldb_init_module(debugger, dict):
|
|
if not 'SKIP_SCRIPTED_PROCESS_LAUNCH' in os.environ:
|
|
debugger.HandleCommand(
|
|
"process launch -C %s.%s" % (__name__,
|
|
MyScriptedProcess.__name__))
|
|
else:
|
|
print("Name of the class that will manage the scripted process: '%s.%s'"
|
|
% (__name__, MyScriptedProcess.__name__)) |