diff options
| author | Keith Randall <keithr@alum.mit.edu> | 2019-01-25 10:21:40 -0800 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2019-01-27 04:02:46 +0000 |
| commit | eafe9a186c84dcfb7db1038cc43d1f0dfd1ea781 (patch) | |
| tree | 0b5437cda2e07de7066adf8fe328722dccac3a86 /test | |
| parent | d585f04fd39f86edaa2aafd776e9ad037d075396 (diff) | |
| download | go-git-eafe9a186c84dcfb7db1038cc43d1f0dfd1ea781.tar.gz | |
cmd/compile: hide init functions in tracebacks
Treat compiler-generated init functions as wrappers, so they will not
be shown in tracebacks.
The exception to this rule is that we'd like to show the line number
of initializers for global variables in tracebacks. In order to
preserve line numbers for those cases, separate out the code for those
initializers into a separate function (which is not marked as
autogenerated).
This CL makes the go binary 0.2% bigger.
Fixes #29919
Change-Id: I0f1fbfc03d10d764ce3a8ddb48fb387ca8453386
Reviewed-on: https://go-review.googlesource.com/c/159717
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Diffstat (limited to 'test')
| -rw-r--r-- | test/fixedbugs/issue29919.dir/a.go | 75 | ||||
| -rw-r--r-- | test/fixedbugs/issue29919.dir/main.go | 10 | ||||
| -rw-r--r-- | test/fixedbugs/issue29919.go | 9 |
3 files changed, 94 insertions, 0 deletions
diff --git a/test/fixedbugs/issue29919.dir/a.go b/test/fixedbugs/issue29919.dir/a.go new file mode 100644 index 0000000000..cfccc4aabb --- /dev/null +++ b/test/fixedbugs/issue29919.dir/a.go @@ -0,0 +1,75 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Make sure tracebacks from initialization code are reported correctly. + +package a + +import ( + "fmt" + "runtime" + "strings" +) + +var x = f() // line 15 + +func f() int { + var b [4096]byte + n := runtime.Stack(b[:], false) // line 19 + s := string(b[:n]) + var pcs [10]uintptr + n = runtime.Callers(1, pcs[:]) // line 22 + + // Check the Stack results. + if debug { + println(s) + } + if strings.Contains(s, "autogenerated") { + panic("autogenerated code in traceback") + } + if !strings.Contains(s, "a.go:15") { + panic("missing a.go:15") + } + if !strings.Contains(s, "a.go:19") { + panic("missing a.go:19") + } + if !strings.Contains(s, "a.init.ializers") { + panic("missing a.init.ializers") + } + + // Check the CallersFrames results. + if debug { + iter := runtime.CallersFrames(pcs[:n]) + for { + f, more := iter.Next() + fmt.Printf("%s %s:%d\n", f.Function, f.File, f.Line) + if !more { + break + } + } + } + iter := runtime.CallersFrames(pcs[:n]) + f, more := iter.Next() + if f.Function != "a.f" || !strings.HasSuffix(f.File, "a.go") || f.Line != 22 { + panic(fmt.Sprintf("bad f %v\n", f)) + } + if !more { + panic("traceback truncated after f") + } + f, more = iter.Next() + if f.Function != "a.init.ializers" || !strings.HasSuffix(f.File, "a.go") || f.Line != 15 { + panic(fmt.Sprintf("bad init.ializers %v\n", f)) + } + if !more { + panic("traceback truncated after init.ializers") + } + f, _ = iter.Next() + if f.Function != "runtime.main" { + panic("runtime.main missing") + } + + return 0 +} + +const debug = false diff --git a/test/fixedbugs/issue29919.dir/main.go b/test/fixedbugs/issue29919.dir/main.go new file mode 100644 index 0000000000..3e99ca891b --- /dev/null +++ b/test/fixedbugs/issue29919.dir/main.go @@ -0,0 +1,10 @@ +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import _ "./a" + +func main() { +} diff --git a/test/fixedbugs/issue29919.go b/test/fixedbugs/issue29919.go new file mode 100644 index 0000000000..6d97592c11 --- /dev/null +++ b/test/fixedbugs/issue29919.go @@ -0,0 +1,9 @@ +// rundir + +// Copyright 2019 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Make sure tracebacks from initialization code are reported correctly. + +package ignored |
