]> Cypherpunks repositories - gostls13.git/commit
runtime: do not print runtime panic frame at top of user stack
authorRuss Cox <rsc@golang.org>
Sun, 13 Nov 2016 04:01:37 +0000 (23:01 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 22 Nov 2016 18:33:30 +0000 (18:33 +0000)
commitf9feaffdf51967bc5cf3c9363db9ddee98c9b3a0
treeff1e8577ec24c1fb611df6597f7466a9c4bc7af3
parentac1dbe6392f2d392f9554127f96597a9aaa721fd
runtime: do not print runtime panic frame at top of user stack

The expected default behavior (no explicit GOTRACEBACK setting)
is for the stack trace to start in user code, eliding unnecessary runtime
frames that led up to the actual trace printing code. The idea was that
the first line number printed was the one that crashed.

For #5832 we added code to show 'panic' frames so that if code panics
and then starts running defers and then we trace from there, the panic
frame can help explain why the code seems to have made a call not
present in the code. But that's only needed for panics between two different
call frames, not the panic at the very top of the stack trace.
Fix the fix to again elide the runtime code at the very top of the stack trace.

Simple panic:

package main

func main() {
var x []int
println(x[1])
}

Before this CL:

panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x1056980, 0x1091bf0)
/Users/rsc/go/src/runtime/panic.go:531 +0x1cf
main.main()
/tmp/x.go:5 +0x5

After this CL:

panic: runtime error: index out of range

goroutine 1 [running]:
main.main()
/tmp/x.go:5 +0x5

Panic inside defer triggered by panic:

package main

func main() {
var x []int
defer func() {
println(x[1])
}()
println(x[2])
}

Before this CL:

panic: runtime error: index out of range
panic: runtime error: index out of range

goroutine 1 [running]:
panic(0x1056aa0, 0x1091bf0)
/Users/rsc/go/src/runtime/panic.go:531 +0x1cf
main.main.func1(0x0, 0x0, 0x0)
/tmp/y.go:6 +0x62
panic(0x1056aa0, 0x1091bf0)
/Users/rsc/go/src/runtime/panic.go:489 +0x2cf
main.main()
/tmp/y.go:8 +0x59

The middle panic is important: it explains why main.main ended up calling main.main.func1 on a line that looks like a call to println. The top panic is noise.

After this CL:

panic: runtime error: index out of range
panic: runtime error: index out of range

goroutine 1 [running]:
main.main.func1(0x0, 0x0, 0x0)
/tmp/y.go:6 +0x62
panic(0x1056ac0, 0x1091bf0)
/Users/rsc/go/src/runtime/panic.go:489 +0x2cf
main.main()
/tmp/y.go:8 +0x59

Fixes #17901.

Change-Id: Id6d7c76373f7a658a537a39ca32b7dc23e1e76aa
Reviewed-on: https://go-review.googlesource.com/33165
Run-TryBot: Russ Cox <rsc@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/runtime/crash_test.go
src/runtime/traceback.go