blob: 0725c2c9c5d9117b8b59f376e3d10df69253ebfd [file]
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