Commit 318309a5 authored by Russ Cox's avatar Russ Cox

runtime/pprof: adjust reported line numbers to show call sites

This is the same logic used in the standard tracebacks.
The caller pc is the pc after the call, so except in the
fake "call" caused by a panic, back up the pc enough
that the lookup will use the previous instruction.

Fixes #4150.
Fixes #4151.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/7317047
parent 8a6ff3ab
...@@ -318,21 +318,33 @@ func printCountProfile(w io.Writer, debug int, name string, p countProfile) erro ...@@ -318,21 +318,33 @@ func printCountProfile(w io.Writer, debug int, name string, p countProfile) erro
// for a single stack trace. // for a single stack trace.
func printStackRecord(w io.Writer, stk []uintptr, allFrames bool) { func printStackRecord(w io.Writer, stk []uintptr, allFrames bool) {
show := allFrames show := allFrames
for _, pc := range stk { wasPanic := false
for i, pc := range stk {
f := runtime.FuncForPC(pc) f := runtime.FuncForPC(pc)
if f == nil { if f == nil {
show = true show = true
fmt.Fprintf(w, "#\t%#x\n", pc) fmt.Fprintf(w, "#\t%#x\n", pc)
wasPanic = false
} else {
tracepc := pc
// Back up to call instruction.
if i > 0 && pc > f.Entry() && !wasPanic {
if runtime.GOARCH == "386" || runtime.GOARCH == "amd64" {
tracepc--
} else { } else {
file, line := f.FileLine(pc) tracepc -= 4 // arm, etc
}
}
file, line := f.FileLine(tracepc)
name := f.Name() name := f.Name()
// Hide runtime.goexit and any runtime functions at the beginning. // Hide runtime.goexit and any runtime functions at the beginning.
// This is useful mainly for allocation traces. // This is useful mainly for allocation traces.
wasPanic = name == "runtime.panic"
if name == "runtime.goexit" || !show && strings.HasPrefix(name, "runtime.") { if name == "runtime.goexit" || !show && strings.HasPrefix(name, "runtime.") {
continue continue
} }
show = true show = true
fmt.Fprintf(w, "#\t%#x\t%s+%#x\t%s:%d\n", pc, f.Name(), pc-f.Entry(), file, line) fmt.Fprintf(w, "#\t%#x\t%s+%#x\t%s:%d\n", pc, name, pc-f.Entry(), file, line)
} }
} }
if !show { if !show {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment