aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/pprof
diff options
context:
space:
mode:
authorTolyan Korniltsev <korniltsev.anatoly@gmail.com>2023-02-04 14:53:34 +0800
committerGopher Robot <gobot@golang.org>2023-02-09 20:43:56 +0000
commitf1855993f3aa0042014952b3a3ce80296df838b1 (patch)
tree71fc5e776f65e1112e007aaa63f41990632180d9 /src/runtime/pprof
parentb7736cbceb46d00fb1c8435e5c512635896985b6 (diff)
downloadgo-f1855993f3aa0042014952b3a3ce80296df838b1.tar.xz
runtime: skip trailing wrappers in runtime_expandFinalInlineFrame
The existing runtime_expandFinalInlineFrame implementation doesn't skip trailing wrappers, but gentraceback does skip wrapper functions. This change makes runtime_expandFinalInlineFrame handling wrapper functions consistent to gentraceback. Fixes #58288 Change-Id: I1b0e2c10b0a89bcb1e787b98d27730cb40a34406 Reviewed-on: https://go-review.googlesource.com/c/go/+/465097 Reviewed-by: Michael Pratt <mpratt@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Michael Pratt <mpratt@google.com> Run-TryBot: Michael Pratt <mpratt@google.com> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/runtime/pprof')
-rw-r--r--src/runtime/pprof/pprof_test.go30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/runtime/pprof/pprof_test.go b/src/runtime/pprof/pprof_test.go
index 53688ad825..b19ac16170 100644
--- a/src/runtime/pprof/pprof_test.go
+++ b/src/runtime/pprof/pprof_test.go
@@ -333,6 +333,23 @@ func inlinedCalleeDump(pcs []uintptr) {
dumpCallers(pcs)
}
+type inlineWrapperInterface interface {
+ dump(stack []uintptr)
+}
+
+type inlineWrapper struct {
+}
+
+func (h inlineWrapper) dump(pcs []uintptr) {
+ dumpCallers(pcs)
+}
+
+func inlinedWrapperCallerDump(pcs []uintptr) {
+ var h inlineWrapperInterface
+ h = &inlineWrapper{}
+ h.dump(pcs)
+}
+
func TestCPUProfileRecursion(t *testing.T) {
matches := matchAndAvoidStacks(stackContains, []string{"runtime/pprof.inlinedCallee", "runtime/pprof.recursionCallee", "runtime/pprof.recursionCaller"}, avoidFunctions())
p := testCPUProfile(t, matches, func(dur time.Duration) {
@@ -2054,6 +2071,8 @@ func TestTryAdd(t *testing.T) {
for i := range pcs {
inlinedCallerStack[i] = uint64(pcs[i])
}
+ wrapperPCs := make([]uintptr, 1)
+ inlinedWrapperCallerDump(wrapperPCs)
if _, found := findInlinedCall(recursionChainBottom, 4<<10); !found {
t.Skip("Can't determine whether anything was inlined into recursionChainBottom.")
@@ -2226,6 +2245,17 @@ func TestTryAdd(t *testing.T) {
{Value: []int64{70, 70 * period}, Location: []*profile.Location{{ID: 1}}},
{Value: []int64{80, 80 * period}, Location: []*profile.Location{{ID: 2}, {ID: 1}}},
},
+ }, {
+ name: "expand_wrapper_function",
+ input: []uint64{
+ 3, 0, 500, // hz = 500. Must match the period.
+ 4, 0, 50, uint64(wrapperPCs[0]),
+ },
+ count: 2,
+ wantLocs: [][]string{{"runtime/pprof.inlineWrapper.dump"}},
+ wantSamples: []*profile.Sample{
+ {Value: []int64{50, 50 * period}, Location: []*profile.Location{{ID: 1}}},
+ },
}}
for _, tc := range testCases {