From e9616a7f98f9e66ebff42113cf1fc5db2406d035 Mon Sep 17 00:00:00 2001 From: Alessandro Arzilli Date: Mon, 4 Nov 2024 17:21:40 +0100 Subject: [PATCH] proc: fix rangeFuncStackTrace with inlined functions (#3849) If an inlined function is encountered we should keep searching for its rangeParent even if we don't have a closurePtr because it could be that the function has been inlined into its rangeParent. This does not need a new test, the existing tests already fail on go1.24. --- pkg/proc/stack.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/pkg/proc/stack.go b/pkg/proc/stack.go index 1af614a8..71c84f2c 100644 --- a/pkg/proc/stack.go +++ b/pkg/proc/stack.go @@ -964,7 +964,7 @@ func rangeFuncStackTrace(tgt *Target, g *G) ([]Stackframe, error) { if fr.SystemStack { return false } - if closurePtr == 0 && optimized(fr.Call.Fn) { + if closurePtr == 0 && optimized(fr.Call.Fn) || frames[len(frames)-1].Inlined { return true } if closurePtr < 0 { @@ -1021,7 +1021,7 @@ func rangeFuncStackTrace(tgt *Target, g *G) ([]Stackframe, error) { if rangeParent == nil { stop = true } - if !optimized(fr.Call.Fn) && closurePtr == 0 { + if !optimized(fr.Call.Fn) && !fr.Inlined && closurePtr == 0 { stop = true } if stop { @@ -1042,6 +1042,11 @@ func rangeFuncStackTrace(tgt *Target, g *G) ([]Stackframe, error) { stage = doneStage return false } + } else if frames[len(frames)-1].Inlined && !fr.Inlined && closurePtr == 0 { + frames = nil + addRetFrame = false + stage = doneStage + return false } case lastFrameStage: frames = append(frames, fr)