DoxigAlpha

getContext

Capture the current context. The register values in the context will reflect the state after the platform getcontext function returns.

It is valid to call this if the platform doesn't have context capturing support, in that case false will be returned.

Function parameters

Parameters

#
context:*ThreadContext

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
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 inline fn getContext(context: *ThreadContext) bool {
    if (native_os == .windows) {
        context.* = std.mem.zeroes(windows.CONTEXT);
        windows.ntdll.RtlCaptureContext(context);
        return true;
    }

    const result = have_getcontext and posix.system.getcontext(context) == 0;
    if (native_os == .macos) {
        assert(context.mcsize == @sizeOf(std.c.mcontext_t));

        // On aarch64-macos, the system getcontext doesn't write anything into the pc
        // register slot, it only writes lr. This makes the context consistent with
        // other aarch64 getcontext implementations which write the current lr
        // (where getcontext will return to) into both the lr and pc slot of the context.
        if (native_arch == .aarch64) context.mcontext.ss.pc = context.mcontext.ss.lr;
    }

    return result;
}