From 15bc1fc06da3b6c622a21fa438e40be247d9dee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Quei=C3=9Fner?= Date: Mon, 3 Oct 2022 19:11:16 +0200 Subject: [PATCH] Much improves the panic function, now prints a stack trace more often. (#86) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Felix "xq" Queißner --- src/core/microzig.zig | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/microzig.zig b/src/core/microzig.zig index 0c9dc6d..76ff4b1 100644 --- a/src/core/microzig.zig +++ b/src/core/microzig.zig @@ -86,27 +86,27 @@ else }; /// The microzig default panic handler. Will disable interrupts and loop endlessly. -pub fn microzig_panic(message: []const u8, maybe_stack_trace: ?*std.builtin.StackTrace, _: ?usize) noreturn { +pub fn microzig_panic(message: []const u8, _: ?*std.builtin.StackTrace, _: ?usize) noreturn { // utilize logging functions std.log.err("microzig PANIC: {s}", .{message}); if (builtin.cpu.arch != .avr) { - var writer = debug.writer(); - writer.print("microzig PANIC: {s}\r\n", .{message}) catch unreachable; - - if (maybe_stack_trace) |stack_trace| { - var frame_index: usize = 0; - var frames_left: usize = std.math.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]; - writer.print("0x{X:0>8}\r\n", .{return_address}) catch unreachable; + var index: usize = 0; + var iter = std.debug.StackIterator.init(@returnAddress(), null); + while (iter.next()) |address| : (index += 1) { + if (index == 0) { + std.log.err("stack trace:", .{}); } + std.log.err("{d: >3}: 0x{X:0>8}", .{ index, address }); } } + if (@import("builtin").mode == .Debug) { + // attach a breakpoint, this might trigger another + // panic internally, so only do that in debug mode. + std.log.info("triggering breakpoint...", .{}); + @breakpoint(); + } hang(); }