blob: 129b0d09c3341eebade2173b30af935a3d26dbe2 [file] [edit]
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