Files
TheRock/rocm-systems/projects/rocprofiler-systems/external/dyninst/stackwalk/doc/2-Abstractions.tex
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

79 lines
4.2 KiB
TeX

\section{Abstractions}
\label{sec:abstractions}
StackwalkerAPI contains two interfaces: the Stackwalking Interface and the
Callback Interface. The stackwalking interface is used to walk the call stack,
query information about stack frames, and collect basic information about
threads. The Callback Interface is used to provide custom mechanisms for walking
a call stack. Users who operate in one of StackwalkerAPI's standard
configurations do not need to use the Callback Interface.
Figure~\ref{fig:object-ownership} shows the ownership hierarchy for
StackwalkerAPI's classes. Ownership is a "contains" relationship; if one class
owns another, then instances of the owner class maintain an exclusive instance
of the other. For example, in Figure~\ref{fig:object-ownership} the each Walker
instance contains exactly one instance of a ProcessState object. No other
instance of Walker uses that instance of ProcessState.
This remainder of this
section briefly describes the six classes that make up StackwalkerAPI's two
interfaces. For more details, see the class descriptions in
Section~\ref{sec:api}.
\input{fig/object-ownership}
\subsection{Stackwalking Interface}
\begin{description}
\item [Walker] The Walker class is the top-level class used for collecting
stackwalks. It provides a simple interface for requesting a stackwalk.
Each Walker object is associated with one process, but may walk the call
stacks of multiple threads within that process.
\item [Frame] A call stack is returned as a vector of Frame objects, where
each Frame object represents a stack frame. It can provide information
about the stack frame and basic information about the function, signal
handler or other mechanism that created it. Users can request
information such as the symbolic name associated with the Frame object,
and values of its saved registers.
\end{description}
\subsection{Callback Interface}
StackwalkerAPI includes default implementations of the Callback Interface on
each of its supported platforms. These default implementations allow
StackwalkerAPI to work "out of the box" in a standard configuration on each
platform. Users can port StackwalkerAPI to new platforms or customize its call
stack walking behavior by implementing their own versions of the classes in the
Callback Interface.
\begin{description}
\item [FrameStepper] A FrameStepper object describes how to walk through a
single type of stack frame. Users can provide an implementation of this
interface that allows StackwalkerAPI to walk through new types of stack
frames. For example, the DyninstAPI uses this interface to extend
StackwalkerAPI to allow it to walk through stack frames created by
instrumentation code.
\item [StepperGroup] A StepperGroup is a collection of FrameStepper objects and
criteria that describes when to use each type of FrameStepper. These
criteria are based on simple address ranges in the code space of the target
process. In the above example with DyninstAPI, it would be the job of the
StepperGroup to identify a stack frame as belonging to instrumentation code
and use the instrumentation FrameStepper to walk through it.
\item [ProcessState] A ProcessState interface describes how to access data in
the target process. To walk a call stack, StackwalkerAPI needs to access
both registers and memory in the target process; ProcessState provides an
interface that StackwalkerAPI can use to access that information.
StackwalkerAPI includes two default implementation of ProcessState for each
platform: one to collect a first party stackwalk in the current process, and
one that uses a debugger interface to collect a third party stackwalk in
another process.
\item [SymbolLookup] The SymbolLookup interface is used to associate a symbolic
name with a stack frame. A stackwalk returns a collection of addresses in
the code space of a binary. This class uses the binary's symbol table to map
those addresses into symbolic names. A default implementation of this class,
which uses the DynSymtab package, is provided with StackwalkerAPI. A user
could, for example, use this interface to allow StackwalkerAPI to use libelf
to look up symbol names instead.
\end{description}