from abc import ABCMeta, abstractmethod from typing import Optional import lldb class ScriptedBreakpointResolver(metaclass=ABCMeta): """ The base class for a scripted breakpoint resolver. """ bkpt: lldb.SBBreakpoint args: lldb.SBStructuredData @abstractmethod def __init__(self, bkpt: lldb.SBBreakpoint, args: lldb.SBStructuredData): """Construct a scripted breakpoint resolver. Args: bkpt (lldb.SBBreakpoint): The breakpoint owning this resolver. args (lldb.SBStructuredData): A Dictionary holding arbitrary key/value pairs used by the scripted breakpoint. """ self.bkpt = bkpt self.args = args def overrides_resolver(self, resolver_data: lldb.SBStructuredData) -> bool: """Decide, from the incoming resolver options, whether this breakpoint should have its resolver replaced by this class. When `True`, this class's `__callback__` picks locations for this breakpoint instead of the original resolver's. Search depth is unaffected either way and still comes from `__get_depth__`. Args: resolver_data (lldb.SBStructuredData): The resolver options passed in when the breakpoint was created. Returns: bool: `True` if this class's `__callback__` should be used in place of the original resolver's, `False` to leave the original resolver in charge. """ return False def set_breakpoint(self, bkpt: lldb.SBBreakpoint) -> None: """Called once the underlying breakpoint has been fully created and associated to this resolver. Args: bkpt (lldb.SBBreakpoint): The breakpoint owning this resolver. """ pass @abstractmethod def __callback__(self, sym_ctx: lldb.SBSymbolContext) -> None: """Called once per symbol context matched by the search depth returned by `__get_depth__`. Set breakpoint locations here by calling `AddLocation` on the resolver's breakpoint. Args: sym_ctx (lldb.SBSymbolContext): The symbol context to inspect. """ pass def __get_depth__(self) -> int: """The search depth at which `__callback__` will be called. Returns: lldb.SBSearchDepth: One of the `lldb.eSearchDepth*` values. Defaults to `lldb.eSearchDepthModule`. """ return lldb.eSearchDepthModule def get_short_help(self) -> Optional[str]: """A one-line description of this resolver, shown by `breakpoint list`. Returns: str: The short help string. """ pass def was_hit( self, frame: lldb.SBFrame, bp_loc: lldb.SBBreakpointLocation ) -> lldb.SBBreakpointLocation: """Called when a location owned by this resolver is hit, to allow overriding which location is reported as hit. Args: frame (lldb.SBFrame): The frame where the breakpoint was hit. bp_loc (lldb.SBBreakpointLocation): The breakpoint location that was hit. Returns: lldb.SBBreakpointLocation: The location to report as hit. Defaults to `bp_loc`. """ return bp_loc def get_location_description( self, bp_loc: lldb.SBBreakpointLocation, level: int ) -> Optional[str]: """Customize the description used when printing a breakpoint location owned by this resolver. Args: bp_loc (lldb.SBBreakpointLocation): The breakpoint location to describe. level (lldb.DescriptionLevel): The level of detail requested. Returns: str: The description for the location. """ pass