• 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
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...