| 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 |