From 013f2ef00d8f6246c72f94229887a4e2d3c9e4b3 Mon Sep 17 00:00:00 2001 From: visualfc Date: Tue, 1 Jul 2025 11:28:48 +0800 Subject: [PATCH] debug: fix print stack for wasm --- .../internal/clite/debug/_wrap/debug_wasm.c | 31 +++++++++++++++++++ runtime/internal/clite/debug/debug.go | 9 ++++++ runtime/internal/clite/debug/debug_wasm.go | 11 +++++++ runtime/internal/runtime/z_rt.go | 8 +---- 4 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 runtime/internal/clite/debug/_wrap/debug_wasm.c diff --git a/runtime/internal/clite/debug/_wrap/debug_wasm.c b/runtime/internal/clite/debug/_wrap/debug_wasm.c new file mode 100644 index 00000000..7e0efcf9 --- /dev/null +++ b/runtime/internal/clite/debug/_wrap/debug_wasm.c @@ -0,0 +1,31 @@ +#ifdef __EMSCRIPTEN__ +//emscripten +#include + +void llgo_print_stack(int skip) { + EM_ASM({ + function getStackTrace() { + var stack; + try { + throw new Error(); + } catch (e) { + stack = e.stack; + } + return stack; + } + + var stack = getStackTrace(); + if (stack) { + var frames = stack.split('\n').slice($0); + frames.forEach(function(frame) { + console.log(frame.trim()); + }); + } + }, skip); +} +#else +// wasi +void llgo_print_stack(int skip){ + +} +#endif diff --git a/runtime/internal/clite/debug/debug.go b/runtime/internal/clite/debug/debug.go index 7a1efc4d..67109984 100644 --- a/runtime/internal/clite/debug/debug.go +++ b/runtime/internal/clite/debug/debug.go @@ -44,3 +44,12 @@ func StackTrace(skip int, fn func(fr *Frame) bool) { return 1 }) } + +func PrintStack(skip int) { + StackTrace(skip+1, func(fr *Frame) bool { + var info Info + Addrinfo(unsafe.Pointer(fr.PC), &info) + c.Fprintf(c.Stderr, c.Str("[0x%08X %s+0x%x, SP = 0x%x]\n"), fr.PC, fr.Name, fr.Offset, fr.SP) + return true + }) +} diff --git a/runtime/internal/clite/debug/debug_wasm.go b/runtime/internal/clite/debug/debug_wasm.go index a4d6e4c6..08bde338 100644 --- a/runtime/internal/clite/debug/debug_wasm.go +++ b/runtime/internal/clite/debug/debug_wasm.go @@ -6,6 +6,10 @@ import ( c "github.com/goplus/llgo/runtime/internal/clite" ) +const ( + LLGoFiles = "_wrap/debug_wasm.c" +) + type Info struct { Fname *c.Char Fbase c.Pointer @@ -31,3 +35,10 @@ type Frame struct { func StackTrace(skip int, fn func(fr *Frame) bool) { panic("not implemented") } + +func PrintStack(skip int) { + print_stack(c.Int(skip + 4)) +} + +//go:linkname print_stack C.llgo_print_stack +func print_stack(skip c.Int) diff --git a/runtime/internal/runtime/z_rt.go b/runtime/internal/runtime/z_rt.go index e2809856..fa29c25d 100644 --- a/runtime/internal/runtime/z_rt.go +++ b/runtime/internal/runtime/z_rt.go @@ -62,13 +62,7 @@ func Rethrow(link *Defer) { if ptr := excepKey.Get(); ptr != nil { if link == nil { TracePanic(*(*any)(ptr)) - debug.StackTrace(0, func(fr *debug.Frame) bool { - var info debug.Info - debug.Addrinfo(unsafe.Pointer(fr.PC), &info) - c.Fprintf(c.Stderr, c.Str("[0x%08X %s+0x%x, SP = 0x%x]\n"), fr.PC, fr.Name, fr.Offset, fr.SP) - return true - }) - + debug.PrintStack(2) c.Free(ptr) c.Exit(2) } else {