writeStackTrace
Function parameters
Parameters
- stack_trace:std.builtin.StackTrace
- writer:*Writer
- debug_info:*SelfInfo
- tty_config:io.tty.Config
Type definitions in this namespace
Types
- SourceLocation
- Unresolved source locations can be represented with a single `usize` that
A fully-featured panic handler namespace which lowers all panics to calls to `panicFn`.
Functions
- FullPanic
- A fully-featured panic handler namespace which lowers all panics to calls to `panicFn`.
- lockStdErr
- Allows the caller to freely write to stderr until `unlockStdErr` is called.
- lockStderrWriter
- Allows the caller to freely write to stderr until `unlockStdErr` is called.
- Print to stderr, silently returning on failure.
- dumpHex
- Tries to print a hexadecimal view of the bytes, unbuffered, and ignores any error returned.
- dumpHexFallible
- Prints a hexadecimal view of the bytes, returning any error that occurs.
- dumpCurrentStackTrace
- Tries to print the current stack trace to stderr, unbuffered, and ignores any error returned.
- dumpCurrentStackTraceToWriter
- Prints the current stack trace to the provided writer.
- copyContext
- Copies one context to another, updating any internal pointers
- relocateContext
- Updates any internal pointers in the context to reflect its current location
- getContext
- Capture the current context.
- dumpStackTraceFromBase
- Tries to print the stack trace starting from the supplied base pointer to stderr,
- captureStackTrace
- Returns a slice with the same pointer as addresses, with a potentially smaller len.
- dumpStackTrace
- Tries to print a stack trace to stderr, unbuffered, and ignores any error returned.
- assert
- Invokes detectable illegal behavior when `ok` is `false`.
- assertReadable
- Invokes detectable illegal behavior when the provided slice is not mapped
- assertAligned
- Invokes detectable illegal behavior when the provided array is not aligned
- panic
- Equivalent to `@panic` but with a formatted message.
- panicExtra
- Equivalent to `@panic` but with a formatted message, and with an explicitly
- defaultPanic
- Dumps a stack trace to standard error, then aborts.
- attachSegfaultHandler
- Attaches a global SIGSEGV handler which calls `@panic("segmentation fault");`
- inValgrind
- Detect whether the program is being executed in the Valgrind virtual machine.
Deprecated because it returns the optimization mode of the standard
Values
- runtime_safety
- Deprecated because it returns the optimization mode of the standard
- sys_can_stack_trace
- = switch (builtin.cpu.arch) { // Observed to go into an infinite loop. // TODO: Make this work. .mips, .mipsel, .mips64, .mips64el, .s390x, => false, // `@returnAddress()` in LLVM 10 gives // "Non-Emscripten WebAssembly hasn't implemented __builtin_return_address". // On Emscripten, Zig only supports `@returnAddress()` in debug builds // because Emscripten's implementation is very slow. .wasm32, .wasm64, => native_os == .emscripten and builtin.mode == .Debug, // `@returnAddress()` is unsupported in LLVM 13. .bpfel, .bpfeb, => false, else => true, }
- have_ucontext
- = posix.ucontext_t != void
- ThreadContext
- Platform-specific thread state.
- have_getcontext
- = @TypeOf(posix.system.getcontext) != void
- have_segfault_handling_support
- Whether or not the current target can print useful debug information when a segfault occurs.
- default_enable_segfault_handler
- = runtime_safety and have_segfault_handling_support
Source
Implementation
pub fn writeStackTrace(
stack_trace: std.builtin.StackTrace,
writer: *Writer,
debug_info: *SelfInfo,
tty_config: io.tty.Config,
) !void {
if (builtin.strip_debug_info) return error.MissingDebugInfo;
var frame_index: usize = 0;
var frames_left: usize = @min(stack_trace.index, stack_trace.instruction_addresses.len);
while (frames_left != 0) : ({
frames_left -= 1;
frame_index = (frame_index + 1) % stack_trace.instruction_addresses.len;
}) {
const return_address = stack_trace.instruction_addresses[frame_index];
try printSourceAtAddress(debug_info, writer, return_address - 1, tty_config);
}
if (stack_trace.index > stack_trace.instruction_addresses.len) {
const dropped_frames = stack_trace.index - stack_trace.instruction_addresses.len;
tty_config.setColor(writer, .bold) catch {};
try writer.print("({d} additional stack frames skipped...)\n", .{dropped_frames});
tty_config.setColor(writer, .reset) catch {};
}
}