From 08376e1a9c57d4b07a77d156810d3fec46caba79 Mon Sep 17 00:00:00 2001 From: Keith Randall Date: Tue, 1 Jul 2025 15:29:12 -0700 Subject: runtime: iterate through inlinings when processing recover() We care about the wrapper-ness of logical frames, not physical frames. Fixes #73916 Fixes #73917 Fixex #73920 Change-Id: Ia17c8390e71e6c0e13e23dcbb7bc7273ef25da90 Reviewed-on: https://go-review.googlesource.com/c/go/+/685375 Reviewed-by: Keith Randall Reviewed-by: Cuong Manh Le LUCI-TryBot-Result: Go LUCI Reviewed-by: Cherry Mui --- src/runtime/panic.go | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) (limited to 'src/runtime/panic.go') diff --git a/src/runtime/panic.go b/src/runtime/panic.go index 1e61c90aef..bf79b6518e 100644 --- a/src/runtime/panic.go +++ b/src/runtime/panic.go @@ -1142,18 +1142,21 @@ func gorecover(_ uintptr) any { nonWrapperFrames := 0 loop: for ; u.valid(); u.next() { - switch u.frame.fn.funcID { - case abi.FuncIDWrapper: - continue - case abi.FuncID_gopanic: - if u.frame.fp == uintptr(p.gopanicFP) && nonWrapperFrames > 0 { - canRecover = true - } - break loop - default: - nonWrapperFrames++ - if nonWrapperFrames > 1 { + for iu, f := newInlineUnwinder(u.frame.fn, u.symPC()); f.valid(); f = iu.next(f) { + sf := iu.srcFunc(f) + switch sf.funcID { + case abi.FuncIDWrapper: + continue + case abi.FuncID_gopanic: + if u.frame.fp == uintptr(p.gopanicFP) && nonWrapperFrames > 0 { + canRecover = true + } break loop + default: + nonWrapperFrames++ + if nonWrapperFrames > 1 { + break loop + } } } } -- cgit v1.3-5-g9baa