Stack Trace Interface
A stack trace contains a list of frames, each with various bits (most optional) describing the context of that frame. Frames should be sorted from oldest to newest.
Stack traces are always part of an exception or a thread. They cannot be declared as a top-level event property. When adding a stack trace to an event, follow this rule of thumb:
- If the stack trace is part of an error, exception or crash, add it to the Exception Interface.
- Otherwise, add it as a thread in the Threads Interface.
frames
- Required. A non-empty list of stack frames (see below). The list isordered from caller to callee, or oldest to youngest. The last frame is theone creating the exception.
registers
- Optional. A map of register names and their values. The values shouldcontain the actual register values of the thread, thus mapping to the lastframe in the list.
Each object should contain at least a filename
, function
or instruction_addr
attribute. All values are optional, but recommended.
filename
- The path to the source file relative to the project root directory.
The value should not make file names indistinguishable and should only change between releases for files that were actually renamed.
In some SDKs, this is implemented as the path relative to a certain entry point relevant to the language/platform. For example, in Python the filename
is relative to PYTHONPATH
or site-packages
.
function
- The name of the function being called.
This function name may be shortened or demangled. If not, Sentry will demangle and shorten it. The original function name will be stored in raw_function
.
raw_function
- The original function name, if the function name is shortened or demangled.Sentry shows the raw function when clicking on the shortened one in the UI.
module
- Platform-specific module path (e.g.
sentry.interfaces.Stacktrace
). lineno
- The line number of the call, starting at 1.
colno
- The column number of the call, starting at 1.
abs_path
- The absolute path to the source file.
context_line
- Source code in filename at
lineno
. pre_context
- A list of source code lines before
context_line
(in order) – usually[lineno - 5:lineno]
. post_context
- A list of source code lines after
context_line
(in order) – usually[lineno + 1:lineno + 5]
. source_link
- A URL representing the source code, e.g. commit-specific GitHub raw source link:
https://raw.githubusercontent.com/getsentry/symbolicator/706d879a426a54230d91799a46a79376ffc86cf3/crates/symbolicator-service/src/types/mod.rs
in_app
- Signals whether this frame is related to the execution of the relevant codein this stack trace. For example, the frames that might power the framework’sweb server of your app are probably not relevant. However, calls to theframework’s library once you start handling code likely are relevant.
stack_start
- Marks this frame as the bottom of a chained stack trace. Stack traces fromasynchronous code consist of several sub traces that are chained together intoone large list. This flag indicates the root function of a chained stack trace.Depending on the runtime and thread, this is either the
main
function or athread base stub. This field should only be specified whentrue
. vars
- A mapping of variables which were available within this frame (usuallycontext-locals).
The following attributes are primarily used for C-based languages:
instruction_addr
- An optional instruction address for symbolication. This should be a stringwith a hexadecimal number that includes a
0x
prefix. If this is set and aknown image is defined in the Debug Meta Interface, thensymbolication can take place. Note that theaddr_mode
attribute cancontrol the behavior of this address. addr_mode
- Optionally changes the addressing mode. The default value is the same as
"abs"
which means absolute referencing. This can also be set to"rel:DEBUG_ID"
or"rel:IMAGE_INDEX"
to make addresses relative to an object referenced by debug idor index. This for instance is necessary for WASM processing as WASM does not usea unified address space. symbol_addr
- An optional address that points to a symbol. We use the instructionaddress for symbolication, but this can be used to calculate an instructionoffset automatically. Note that the
addr_mode
attribute cancontrol the behavior of this address. image_addr
- Optionally an address of the debug image to reference.
package
- The "package" the frame was contained in. Depending on the platform, this canbe different things. For C#, it can be the name of the assembly. For nativecode, it can be the path of the dynamic library, etc.
platform
- This can override the platform for a single frame. Otherwise, the platform ofthe event is assumed. This can be used for multi-platform stack traces, suchas in React Native.
For the given example program written in Python:
def foo():
my_var = 'foo'
raise ValueError()
def main():
foo()
A minimalistic stack trace for the above program in the correct order:
{
"frames": [{ "function": "main" }, { "function": "foo" }]
}
The top frame fully populated with five lines of source context:
{
"frames": [
{
"in_app": true,
"function": "myfunction",
"abs_path": "/real/file/name.py",
"filename": "file/name.py",
"lineno": 3,
"vars": {
"my_var": "'value'"
},
"pre_context": ["def foo():", " my_var = 'foo'"],
"context_line": " raise ValueError()",
"post_context": ["", "def main():"]
}
]
}
A minimal native stack trace with register values. Note that the package
event attribute must be "native"
for these frames to be symbolicated.
{
"frames": [
{ "instruction_addr": "0x7fff5bf3456c" },
{ "instruction_addr": "0x7fff5bf346c0" }
],
"registers": {
"rip": "0x00007ff6eef54be2",
"rsp": "0x0000003b710cd9e0"
}
}
Our documentation is open source and available on GitHub. Your contributions are welcome, whether fixing a typo (drat!) or suggesting an update ("yeah, this would be better").