from abc import ABCMeta, abstractmethod import lldb class ScriptedHook(metaclass=ABCMeta): """ The base class for a scripted target hook. A single `ScriptedHook` subclass backs both `target hook add -P` and `target stop-hook add -P`. `handle_stop` is required so a hook can always be attached as a stop-hook; `handle_module_loaded` and `handle_module_unloaded` are optional and only called for hooks registered via `target hook add -P`. """ target: lldb.SBTarget args: lldb.SBStructuredData @abstractmethod def __init__(self, target: lldb.SBTarget, args: lldb.SBStructuredData): """Construct a scripted hook. Args: target (lldb.SBTarget): The target owning this hook. args (lldb.SBStructuredData): A Dictionary holding arbitrary key/value pairs used by the scripted hook. """ self.target = target self.args = args def handle_module_loaded(self, stream: lldb.SBStream) -> None: """Called whenever a module is loaded into the target. Args: stream (lldb.SBStream): The stream to which the hook can write output that will be reported to the user. """ pass def handle_module_unloaded(self, stream: lldb.SBStream) -> None: """Called whenever a module is unloaded from the target. Args: stream (lldb.SBStream): The stream to which the hook can write output that will be reported to the user. """ pass @abstractmethod def handle_stop( self, exe_ctx: lldb.SBExecutionContext, stream: lldb.SBStream ) -> bool: """Called whenever the process stops, before control is returned to the user. Args: exe_ctx (lldb.SBExecutionContext): The execution context at the point of the stop. stream (lldb.SBStream): The stream to which the hook can write output that will be reported to the user. Returns: bool: `True` if the process should stop and control should be returned to the user, `False` if the process should keep running. """ pass