• Russ Cox's avatar
    runtime: do not print runtime panic frame at top of user stack · f9feaffd
    Russ Cox authored
    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: 's avatarIan Lance Taylor <iant@golang.org>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    f9feaffd
crash_test.go 13.3 KB