mirror of
https://github.com/llvm/llvm-project.git
synced 2026-10-26 13:53:31 +08:00
This is a scripted equivalent of the "trampoline handler" that lldb uses to run to the target of a dynamic dispatch stub, or to the target of std::function, or an objc message send.
120 lines
4.0 KiB
Python
120 lines
4.0 KiB
Python
from abc import ABCMeta
|
|
from typing import Optional
|
|
|
|
import lldb
|
|
|
|
|
|
class ScriptedStackFrameRecognizer(metaclass=ABCMeta):
|
|
"""
|
|
The base class for a scripted stack frame recognizer.
|
|
|
|
A frame recognizer inspects a stack frame at stop time and can:
|
|
|
|
- attach recognized arguments to it (surfaced the same way as args
|
|
for unrecognized frames);
|
|
- hide the frame from backtraces;
|
|
- override the stop description reported for it;
|
|
- expose an exception object associated with it (e.g. a runtime's
|
|
thrown value);
|
|
- redirect auto-selection to a more relevant frame (e.g. bounce past
|
|
a language-runtime trampoline).
|
|
|
|
Register the recognizer with `frame recognizer add -l <ClassName> ...`.
|
|
|
|
Every method is optional: a recognizer only implements the ones it
|
|
cares about. A recognizer that just hides frames can implement only
|
|
`should_hide`; one that surfaces exception info can implement only
|
|
`get_exception` and `get_stop_description`.
|
|
"""
|
|
|
|
def __init__(self):
|
|
"""Construct a scripted stack frame recognizer.
|
|
|
|
Recognizers are constructed with no arguments and are shared across
|
|
every frame they're asked to recognize.
|
|
"""
|
|
pass
|
|
|
|
def get_recognized_arguments(self, frame: lldb.SBFrame) -> list:
|
|
"""Get the arguments recognized for this frame.
|
|
|
|
Args:
|
|
frame (lldb.SBFrame): The frame to inspect.
|
|
|
|
Returns:
|
|
list of lldb.SBValue: The recognized arguments, or an empty list
|
|
if none could be recognized.
|
|
"""
|
|
return []
|
|
|
|
def should_hide(self, frame: lldb.SBFrame) -> bool:
|
|
"""Whether this frame should be hidden when displaying backtraces.
|
|
|
|
Args:
|
|
frame (lldb.SBFrame): The frame to inspect.
|
|
|
|
Returns:
|
|
bool: `True` if this frame should be hidden, `False` otherwise.
|
|
Defaults to `False`.
|
|
"""
|
|
return False
|
|
|
|
def select_most_relevant_frame(self, frame: lldb.SBFrame) -> Optional[lldb.SBFrame]:
|
|
"""Pick a different frame to auto-select when the process stops in
|
|
this recognized frame. Useful when the recognized frame is trampoline
|
|
code that the user probably didn't want to land in (e.g. a language
|
|
runtime's exception-throw path).
|
|
|
|
Args:
|
|
frame (lldb.SBFrame): The recognized frame.
|
|
|
|
Returns:
|
|
lldb.SBFrame: The frame to select instead, or `None` to keep
|
|
the default selection.
|
|
"""
|
|
return None
|
|
|
|
def get_exception(self, frame: lldb.SBFrame) -> Optional[lldb.SBValue]:
|
|
"""Get the exception value associated with this recognized frame,
|
|
if any (e.g. the exception object at a language runtime's throw
|
|
site).
|
|
|
|
Args:
|
|
frame (lldb.SBFrame): The recognized frame.
|
|
|
|
Returns:
|
|
lldb.SBValue: The exception value, or `None` if this frame
|
|
doesn't correspond to an exception.
|
|
"""
|
|
return None
|
|
|
|
def get_stop_description(self, frame: lldb.SBFrame) -> str:
|
|
"""Get the stop description to surface for this recognized frame,
|
|
replacing whatever description lldb would have printed.
|
|
|
|
Args:
|
|
frame (lldb.SBFrame): The recognized frame.
|
|
|
|
Returns:
|
|
str: The stop description, or the empty string to keep the
|
|
default.
|
|
"""
|
|
return ""
|
|
|
|
def get_step_through_plan(self, thread):
|
|
"""Provide a 'step through' plan from the stopped frame.
|
|
Args:
|
|
thread (lldb.SBThread): passed in is the one to step. You
|
|
will only be asked to step through from the zeroth frame of that
|
|
thread.
|
|
|
|
Returns:
|
|
Python dictionary with two keys:
|
|
|
|
class_name : name of a class implementing a ScriptedThreadPlan.
|
|
extra_args : a dictionary that will be passed to the
|
|
__init__ of your scripted thread plan. The extra_args is optional.
|
|
"""
|
|
|
|
return None
|