aboutsummaryrefslogtreecommitdiff
path: root/lib/std/debug.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2024-08-02 12:00:08 -0700
committerAndrew Kelley <andrew@ziglang.org>2024-08-02 14:14:59 -0700
commit975c185b92a7d470ea705b28f46a8004bdda3c60 (patch)
treecb0d037c9a2f38b348ae10b621db417e2f941fa1 /lib/std/debug.zig
parent48d584e3a33a76ef4ea643905a11d311e9ed8bbf (diff)
downloadzig-975c185b92a7d470ea705b28f46a8004bdda3c60.tar.gz
zig-975c185b92a7d470ea705b28f46a8004bdda3c60.zip
fix compilation on powerpc GNU systems
...which have a ucontext_t but not a PC register. The current stack unwinding implementation does not yet support this architecture. Also fix name of `std.debug.SelfInfo.openSelf` to remove redundancy. Also removed this hook into root providing an "openSelfDebugInfo" function. Sorry, this debugging code is not of sufficient quality to offer a plugin API right now.
Diffstat (limited to 'lib/std/debug.zig')
-rw-r--r--lib/std/debug.zig22
1 files changed, 15 insertions, 7 deletions
diff --git a/lib/std/debug.zig b/lib/std/debug.zig
index 0f10bada71..4d3437f665 100644
--- a/lib/std/debug.zig
+++ b/lib/std/debug.zig
@@ -88,7 +88,7 @@ pub fn getSelfDebugInfo() !*SelfInfo {
if (self_debug_info) |*info| {
return info;
} else {
- self_debug_info = try SelfInfo.openSelf(getDebugInfoAllocator());
+ self_debug_info = try SelfInfo.open(getDebugInfoAllocator());
return &self_debug_info.?;
}
}
@@ -573,17 +573,19 @@ pub const StackIterator = struct {
pub fn initWithContext(first_address: ?usize, debug_info: *SelfInfo, context: *posix.ucontext_t) !StackIterator {
// The implementation of DWARF unwinding on aarch64-macos is not complete. However, Apple mandates that
// the frame pointer register is always used, so on this platform we can safely use the FP-based unwinder.
- if (builtin.target.isDarwin() and native_arch == .aarch64) {
+ if (builtin.target.isDarwin() and native_arch == .aarch64)
return init(first_address, context.mcontext.ss.fp);
- } else {
+
+ if (SelfInfo.supports_unwinding) {
var iterator = init(first_address, null);
iterator.unwind_state = .{
.debug_info = debug_info,
.dwarf_context = try SelfInfo.UnwindContext.init(debug_info.allocator, context),
};
-
return iterator;
}
+
+ return init(first_address, null);
}
pub fn deinit(it: *StackIterator) void {
@@ -725,11 +727,13 @@ pub fn writeCurrentStackTrace(
tty_config: io.tty.Config,
start_addr: ?usize,
) !void {
- var context: ThreadContext = undefined;
- const has_context = getContext(&context);
if (native_os == .windows) {
+ var context: ThreadContext = undefined;
+ assert(getContext(&context));
return writeStackTraceWindows(out_stream, debug_info, tty_config, &context, start_addr);
}
+ var context: ThreadContext = undefined;
+ const has_context = getContext(&context);
var it = (if (has_context) blk: {
break :blk StackIterator.initWithContext(start_addr, debug_info, &context) catch null;
@@ -1340,7 +1344,7 @@ test "manage resources correctly" {
}
const writer = std.io.null_writer;
- var di = try SelfInfo.openSelf(testing.allocator);
+ var di = try SelfInfo.open(testing.allocator);
defer di.deinit();
try printSourceAtAddress(&di, writer, showMyTrace(), io.tty.detectConfig(std.io.getStdErr()));
}
@@ -1581,5 +1585,9 @@ pub inline fn inValgrind() bool {
}
test {
+ _ = &Dwarf;
+ _ = &MemoryAccessor;
+ _ = &Pdb;
+ _ = &SelfInfo;
_ = &dumpHex;
}