1
0
mirror of https://github.com/golang/go synced 2024-11-19 14:24:47 -07:00

testing: use runtime/debug to format panics

Among other things, this avoids putting a testing.go:nnn:
prefix on every line of the stack trace.

R=golang-dev, r, dsymonds, r
CC=golang-dev
https://golang.org/cl/5651081
This commit is contained in:
Russ Cox 2012-02-12 23:39:40 -05:00
parent 6a75ece01c
commit f735d2d9d3
2 changed files with 9 additions and 19 deletions

View File

@ -2,9 +2,10 @@
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package debug
package debug_test
import (
. "runtime/debug"
"strings"
"testing"
)

View File

@ -71,6 +71,7 @@ import (
"fmt"
"os"
"runtime"
"runtime/debug"
"runtime/pprof"
"strconv"
"strings"
@ -225,19 +226,6 @@ func (c *common) Fatalf(format string, args ...interface{}) {
c.FailNow()
}
// TODO(dsymonds): Consider hooking into runtime·traceback instead.
func (c *common) stack() {
for i := 2; ; i++ { // Caller we care about is the user, 2 frames up
pc, file, line, ok := runtime.Caller(i)
f := runtime.FuncForPC(pc)
if !ok || f == nil {
break
}
c.Logf("%s:%d (0x%x)", file, line, pc)
c.Logf("\t%s", f.Name())
}
}
// Parallel signals that this test is to be run in parallel with (and only with)
// other parallel tests in this CPU group.
func (t *T) Parallel() {
@ -260,11 +248,12 @@ func tRunner(t *T, test *InternalTest) {
// a call to runtime.Goexit, record the duration and send
// a signal saying that the test is done.
defer func() {
// Consider any uncaught panic a failure.
if err := recover(); err != nil {
t.failed = true
t.Log(err)
t.stack()
if false {
// Log and recover from panic instead of aborting binary.
if err := recover(); err != nil {
t.failed = true
t.Logf("%s\n%s", err, debug.Stack())
}
}
t.duration = time.Now().Sub(t.start)