diff options
author | Austin Clements <austin@google.com> | 2023-01-05 09:08:25 -0500 |
---|---|---|
committer | Austin Clements <austin@google.com> | 2023-01-09 20:25:19 +0000 |
commit | 0bbd67e52f98ce45e39e9a43e3c87a8c32aabbd2 (patch) | |
tree | 7cc323a3c6697c77f94c84072bec105f5ba568d9 | |
parent | d9f23cfe78eadcdbde31fd931e90bebb72455648 (diff) | |
download | go-0bbd67e52f98ce45e39e9a43e3c87a8c32aabbd2.tar.gz go-0bbd67e52f98ce45e39e9a43e3c87a8c32aabbd2.zip |
runtime/pprof: document possibility of empty stacks
I spent quite a while determining the cause of empty stacks in
profiles and reasoning out why this is okay. There isn't a great place
to record this knowledge, but a documentation comment on
appendLocsForStack is better than nothing.
Updates #51550.
Change-Id: I2eefc6ea31f1af885885c3d96199319f45edb4ce
Reviewed-on: https://go-review.googlesource.com/c/go/+/460695
Reviewed-by: Felix Geisendörfer <felix.geisendoerfer@datadoghq.com>
Run-TryBot: Austin Clements <austin@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Michael Pratt <mpratt@google.com>
-rw-r--r-- | src/runtime/pprof/proto.go | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/src/runtime/pprof/proto.go b/src/runtime/pprof/proto.go index 8a49e144b9..b68f30d923 100644 --- a/src/runtime/pprof/proto.go +++ b/src/runtime/pprof/proto.go @@ -395,6 +395,10 @@ func (b *profileBuilder) build() { // location ID slice, locs. The addresses in the stack are return PCs or 1 + the PC of // an inline marker as the runtime traceback function returns. // +// It may return an empty slice even if locs is non-empty, for example if locs consists +// solely of runtime.goexit. We still count these empty stacks in profiles in order to +// get the right cumulative sample count. +// // It may emit to b.pb, so there must be no message encoding in progress. func (b *profileBuilder) appendLocsForStack(locs []uint64, stk []uintptr) (newLocs []uint64) { b.deck.reset() |