From 65f855b251c5fc209e3b697e2998c7e1a2c15703 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Thu, 2 Jan 2025 21:45:11 +0800 Subject: [PATCH 1/3] runtime: show stacktrace when panic --- _demo/failed/stacktrace/main.go | 42 +++++++++++++++++++++++++++++++++ c/debug/_wrap/debug.c | 3 ++- c/debug/debug.go | 4 ++++ internal/runtime/z_rt.go | 8 +++++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 _demo/failed/stacktrace/main.go diff --git a/_demo/failed/stacktrace/main.go b/_demo/failed/stacktrace/main.go new file mode 100644 index 00000000..8ef18424 --- /dev/null +++ b/_demo/failed/stacktrace/main.go @@ -0,0 +1,42 @@ +package main + +import ( + "fmt" +) + +type MyStruct[T any] struct { + value T +} + +func (m *MyStruct[T]) Method() { + fmt.Println("In generic method") + genericFunc[T](m.value) +} + +func genericFunc[T any](v T) { + fmt.Println("In generic function") + normalFunc() +} + +func normalFunc() { + fmt.Println("In normal function") + panic("panic occurs here") +} + +func main() { + m := &MyStruct[string]{value: "hello"} + m.Method() +} + +//Expected: +// In generic method +// In generic function +// In normal function +// panic: panic occurs here + +// [0x00C6D310 github.com/goplus/llgo/internal/runtime.Rethrow+0x2f, SP = 0x60] +// [0x00C6CF44 github.com/goplus/llgo/internal/runtime.Panic+0x2d, SP = 0x50] +// [0x00C69420 main.normalFunc+0xf, SP = 0xa8] +// [0x00C69564 main.genericFunc[string]+0x18, SP = 0x74] +// [0x00C694A8 main.(*MyStruct[string]).Method+0x1f, SP = 0x84] +// [0x00C6936C main+0x4, SP = 0x40] diff --git a/c/debug/_wrap/debug.c b/c/debug/_wrap/debug.c index 51cdde32..4b11a191 100644 --- a/c/debug/_wrap/debug.c +++ b/c/debug/_wrap/debug.c @@ -1,4 +1,5 @@ #if defined(__linux__) +#define UNW_LOCAL_ONLY #define _GNU_SOURCE #include #endif @@ -35,4 +36,4 @@ void llgo_stacktrace(int skip, void *ctx, int (*fn)(void *ctx, void *pc, void *o } } } -} +} \ No newline at end of file diff --git a/c/debug/debug.go b/c/debug/debug.go index c208d3c4..16e00eea 100644 --- a/c/debug/debug.go +++ b/c/debug/debug.go @@ -1,5 +1,9 @@ package debug +/* +#cgo linux LDFLAGS: -lunwind +*/ +import "C" import ( "unsafe" diff --git a/internal/runtime/z_rt.go b/internal/runtime/z_rt.go index 672adf62..ef65822e 100644 --- a/internal/runtime/z_rt.go +++ b/internal/runtime/z_rt.go @@ -20,6 +20,7 @@ import ( "unsafe" "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/debug" "github.com/goplus/llgo/c/pthread" "github.com/goplus/llgo/c/signal" "github.com/goplus/llgo/c/syscall" @@ -61,6 +62,13 @@ 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 + }) + c.Free(ptr) c.Exit(2) } else { From 6df961292dbc6560191ead3578ef484c11189d28 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Thu, 2 Jan 2025 22:30:37 +0800 Subject: [PATCH 2/3] doc: install libunwind-dev on ubuntu --- README.md | 2 +- doc/_readme/scripts/install_ubuntu.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d1b9c793..a817a1f9 100644 --- a/README.md +++ b/README.md @@ -376,7 +376,7 @@ go install -v github.com/goplus/llgo/cmd/llgo@latest echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-get update -sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev +sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libunwind-dev sudo apt-get install -y python3.12-dev # optional go install -v github.com/goplus/llgo/cmd/llgo@latest ``` diff --git a/doc/_readme/scripts/install_ubuntu.sh b/doc/_readme/scripts/install_ubuntu.sh index b36e42d7..e749f237 100644 --- a/doc/_readme/scripts/install_ubuntu.sh +++ b/doc/_readme/scripts/install_ubuntu.sh @@ -2,6 +2,6 @@ echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-18 main" | sudo tee /etc/apt/sources.list.d/llvm.list wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-get update -sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev +sudo apt-get install -y llvm-18-dev clang-18 libclang-18-dev lld-18 pkg-config libgc-dev libssl-dev zlib1g-dev libcjson-dev libsqlite3-dev libunwind-dev sudo apt-get install -y python3.12-dev # optional go install -v github.com/goplus/llgo/cmd/llgo@latest \ No newline at end of file From 9cb48003b0242914438e37e0ce10eb52bab25078 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Thu, 2 Jan 2025 22:31:02 +0800 Subject: [PATCH 3/3] ci: add libunwind-dev on ubuntu --- .github/workflows/go.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index a8e7aee0..8819e8ce 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -62,7 +62,7 @@ jobs: echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{matrix.llvm}} main" | sudo tee /etc/apt/sources.list.d/llvm.list wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - sudo apt-get update - sudo apt-get install -y llvm-${{matrix.llvm}}-dev clang-${{matrix.llvm}} libclang-${{matrix.llvm}}-dev lld-${{matrix.llvm}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev + sudo apt-get install -y llvm-${{matrix.llvm}}-dev clang-${{matrix.llvm}} libclang-${{matrix.llvm}}-dev lld-${{matrix.llvm}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev libunwind-dev echo "/usr/lib/llvm-${{matrix.llvm}}/bin" >> $GITHUB_PATH # Install optional deps for demos.