diff options
| author | Keith Randall <khr@google.com> | 2019-09-23 14:36:48 -0700 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2019-11-08 21:05:17 +0000 |
| commit | 9ee6ba089dc9dd2402bccd9ed28b07140f76de15 (patch) | |
| tree | 49f74474a7613c22e062d96cd3d33b21eb4a4380 /src/runtime/pprof | |
| parent | 9e914f55dded9f779aae86cfb2e989bc9a1d3ea4 (diff) | |
| download | go-9ee6ba089dc9dd2402bccd9ed28b07140f76de15.tar.xz | |
runtime: fix line number for faulting instructions
Unlike function calls, when processing instructions that directly
fault we must not subtract 1 from the pc before looking up the
file/line information.
Since the file/line lookup unconditionally subtracts 1, add 1 to
the faulting instruction PCs to compensate.
Fixes #34123
Change-Id: Ie7361e3d2f84a0d4f48d97e5a9e74f6291ba7a8b
Reviewed-on: https://go-review.googlesource.com/c/go/+/196962
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Emmanuel Odeke <emm.odeke@gmail.com>
Diffstat (limited to 'src/runtime/pprof')
| -rw-r--r-- | src/runtime/pprof/proto.go | 6 | ||||
| -rw-r--r-- | src/runtime/pprof/proto_test.go | 6 |
2 files changed, 3 insertions, 9 deletions
diff --git a/src/runtime/pprof/proto.go b/src/runtime/pprof/proto.go index c269c3a652..3e6012df57 100644 --- a/src/runtime/pprof/proto.go +++ b/src/runtime/pprof/proto.go @@ -359,13 +359,7 @@ func (b *profileBuilder) build() { } } - // Addresses from stack traces point to the next instruction after each call, - // except for the leaf, which points to where the signal occurred. - // appendLocsForStack expects return PCs so increment the leaf address to - // look like a return PC. - e.stk[0] += 1 locs = b.appendLocsForStack(locs[:0], e.stk) - e.stk[0] -= 1 // undo the adjustment on the leaf. b.pbSample(values, locs, labels) } diff --git a/src/runtime/pprof/proto_test.go b/src/runtime/pprof/proto_test.go index eda2b003ad..f3456ffede 100644 --- a/src/runtime/pprof/proto_test.go +++ b/src/runtime/pprof/proto_test.go @@ -116,9 +116,9 @@ func TestConvertCPUProfile(t *testing.T) { b := []uint64{ 3, 0, 500, // hz = 500 - 5, 0, 10, uint64(addr1), uint64(addr1 + 2), // 10 samples in addr1 - 5, 0, 40, uint64(addr2), uint64(addr2 + 2), // 40 samples in addr2 - 5, 0, 10, uint64(addr1), uint64(addr1 + 2), // 10 samples in addr1 + 5, 0, 10, uint64(addr1 + 1), uint64(addr1 + 2), // 10 samples in addr1 + 5, 0, 40, uint64(addr2 + 1), uint64(addr2 + 2), // 40 samples in addr2 + 5, 0, 10, uint64(addr1 + 1), uint64(addr1 + 2), // 10 samples in addr1 } p, err := translateCPUProfile(b) if err != nil { |
