]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/pprof: don't produce 0 location in count profiles
authorAustin Clements <austin@google.com>
Wed, 17 May 2017 18:27:28 +0000 (14:27 -0400)
committerAustin Clements <austin@google.com>
Wed, 17 May 2017 18:58:31 +0000 (18:58 +0000)
profileBuilder.locForPC returns 0 to mean "no location" because 0 is
an invalid location index. However, the code to build count profiles
doesn't check the result of locForPC, so this 0 location index ends up
in the profile's location list. This, in turn, causes problems later
when we decode the profile because it puts a nil *Location in the
sample's location slice, which can later lead to a nil pointer panic.

Fix this by making printCountProfile correctly discard the result of
locForPC if it returns 0. This makes this call match the other two
calls of locForPC.

Updates #15156.

Change-Id: I4492b3652b513448bc56f4cfece4e37da5e42f94
Reviewed-on: https://go-review.googlesource.com/43630
Reviewed-by: Michael Matloob <matloob@golang.org>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/runtime/pprof/pprof.go

index b6253b1aa5ce5f43845a0358ad86c4b72e5fc117..21ea25ce36b0addd5fed16a4083d5daa0c222e07 100644 (file)
@@ -401,7 +401,11 @@ func printCountProfile(w io.Writer, debug int, name string, p countProfile) erro
                for _, addr := range p.Stack(index[k]) {
                        // For count profiles, all stack addresses are
                        // return PCs, which is what locForPC expects.
-                       locs = append(locs, b.locForPC(addr))
+                       l := b.locForPC(addr)
+                       if l == 0 { // runtime.goexit
+                               continue
+                       }
+                       locs = append(locs, l)
                }
                b.pbSample(values, locs, nil)
        }