feature. See also
. The project being documented here (as the example) is the Zig library itself.
debug.writeTrace
fn writeTrace(
addresses: []const usize,
skipped: SkippedAddresses,
t: Io.Terminal,
resolve_inline_callers: bool,
) Writer.Error!void
File
Code
fn writeTrace(
addresses: []const usize,
skipped: SkippedAddresses,
t: Io.Terminal,
resolve_inline_callers: bool,
) Writer.Error!void {
var text_arena: std.heap.ArenaAllocator = .init(getDebugInfoAllocator());
defer text_arena.deinit();
const writer = t.writer;
if (!std.options.allow_stack_tracing) {
t.setColor(.dim) catch {};
try writer.print("Cannot print stack trace: stack tracing is disabled\n", .{});
t.setColor(.reset) catch {};
return;
}
if (addresses.len == 0) return writer.writeAll("(empty stack trace)\n");
const di = getSelfDebugInfo() catch |err| switch (err) {
error.UnsupportedTarget => {
t.setColor(.dim) catch {};
try writer.print("Cannot print stack trace: debug info unavailable for target\n\n", .{});
t.setColor(.reset) catch {};
return;
},
};
const io = std.Options.debug_io;
for (addresses) |addr| {
// Subtract 1 to get an address *in* the function call for a better source location.
try printSourceAtAddress(io, &text_arena, di, t, .{
.address = addr -| StackIterator.ra_call_offset,
.resolve_inline_callers = resolve_inline_callers,
});
}
switch (skipped) {
.none => {},
.unknown => {
t.setColor(.bold) catch {};
try writer.writeAll("(additional stack frames may have been skipped...)\n");
t.setColor(.reset) catch {};
},
else => |n| {
t.setColor(.bold) catch {};
try writer.print("({d} additional stack frames skipped due to buffer size limitations...)\n", .{n});
t.setColor(.reset) catch {};
},
}
}