[lldb] Add ScriptedPlatform python implementation

This patch introduces both the Scripted Platform python base
implementation and an example for it.

The base implementation is embedded in lldb python module under
`lldb.plugins.scripted_platform`.

This patch also refactor the various SWIG methods to create scripted
objects into a single method, that is now shared between the Scripted
Platform, Process and Thread. It also replaces the target argument by a
execution context object.

Differential Revision: https://reviews.llvm.org/D139250

Signed-off-by: Med Ismail Bennani <medismail.bennani@gmail.com>
This commit is contained in:
Med Ismail Bennani
2023-01-11 23:04:24 -08:00
parent 2d53527e9c
commit bb4ccc6688
13 changed files with 176 additions and 82 deletions

View File

@@ -62,8 +62,8 @@ class CrashLogScriptedProcess(ScriptedProcess):
self.addr_mask,
self.target)
def __init__(self, target: lldb.SBTarget, args : lldb.SBStructuredData):
super().__init__(target, args)
def __init__(self, exe_ctx: lldb.SBExecutionContext, args : lldb.SBStructuredData):
super().__init__(exe_ctx, args)
if not self.target or not self.target.IsValid():
# Return error

View File

@@ -0,0 +1,96 @@
from abc import ABCMeta, abstractmethod
import lldb
class ScriptedPlatform(metaclass=ABCMeta):
"""
The base class for a scripted platform.
Most of the base class methods are `@abstractmethod` that need to be
overwritten by the inheriting class.
DISCLAIMER: THIS INTERFACE IS STILL UNDER DEVELOPMENT AND NOT STABLE.
THE METHODS EXPOSED MIGHT CHANGE IN THE FUTURE.
"""
processes = None
@abstractmethod
def __init__(self, exe_ctx, args):
""" Construct a scripted platform.
Args:
exe_ctx (lldb.SBExecutionContext): The execution context for the scripted platform
args (lldb.SBStructuredData): A Dictionary holding arbitrary
key/value pairs used by the scripted platform.
"""
processes = []
@abstractmethod
def list_processes(self):
""" Get a list of processes that are running or that can be attached to on the platform.
processes = {
420: {
name: a.out,
arch: aarch64,
pid: 420,
parent_pid: 42 (optional),
uid: 0 (optional),
gid: 0 (optional),
},
}
Returns:
Dict: The processes represented as a dictionary, with at least the
process ID, name, architecture. Optionally, the user can also
provide the parent process ID and the user and group IDs.
The dictionary can be empty.
"""
pass
def get_process_info(self, pid):
""" Get the dictionary describing the process.
Returns:
Dict: The dictionary of process info that matched process ID.
None if the process doesn't exists
"""
pass
@abstractmethod
def attach_to_process(self, attach_info):
""" Attach to a process.
Args:
attach_info (lldb.SBAttachInfo): The information related to attach to a process.
Returns:
lldb.SBError: A status object notifying if the attach succeeded.
"""
pass
@abstractmethod
def launch_process(self, launch_info):
""" Launch a process.
Args:
launch_info (lldb.SBLaunchInfo): The information related to the process launch.
Returns:
lldb.SBError: A status object notifying if the launch succeeded.
"""
pass
@abstractmethod
def kill_process(self, pid):
""" Kill a process.
Args:
pid (int): Process ID for the process to be killed.
Returns:
lldb.SBError: A status object notifying if the shutdown succeeded.
"""
pass

View File

@@ -20,17 +20,20 @@ class ScriptedProcess(metaclass=ABCMeta):
metadata = None
@abstractmethod
def __init__(self, target, args):
def __init__(self, exe_ctx, args):
""" Construct a scripted process.
Args:
target (lldb.SBTarget): The target launching the scripted process.
exe_ctx (lldb.SBExecutionContext): The execution context for the scripted process.
args (lldb.SBStructuredData): A Dictionary holding arbitrary
key/value pairs used by the scripted process.
"""
target = None
self.target = None
self.args = None
self.arch = None
if isinstance(exe_ctx, lldb.SBExecutionContext):
target = exe_ctx.target
if isinstance(target, lldb.SBTarget) and target.IsValid():
self.target = target
triple = self.target.triple