diff --git a/profiler/profile.go b/profiler/profile.go index b3b6d62532..fae0cf47c9 100644 --- a/profiler/profile.go +++ b/profiler/profile.go @@ -327,7 +327,7 @@ func goroutineDebug2ToPprof(r io.Reader, w io.Writer, t time.Time) (err error) { p.Location = append(p.Location, location) locationID++ - sample.Location = append([]*pprofile.Location{location}, sample.Location...) + sample.Location = append(sample.Location, location) } p.Sample = append(p.Sample, sample) diff --git a/profiler/profile_test.go b/profiler/profile_test.go index da7b0d7013..579375fa58 100644 --- a/profiler/profile_test.go +++ b/profiler/profile_test.go @@ -129,6 +129,15 @@ main.main() // pro tip: enable line below to inspect the pprof output using cli tools // ioutil.WriteFile(prof.name, prof.data, 0644) + requireFunctions := func(t *testing.T, s *pprofile.Sample, want []string) { + t.Helper() + var got []string + for _, loc := range s.Location { + got = append(got, loc.Line[0].Function.Name) + } + require.Equal(t, want, got) + } + pp, err := pprofile.Parse(bytes.NewReader(prof.data)) require.NoError(t, err) // timestamp @@ -146,9 +155,16 @@ main.main() require.Equal(t, []int64{3}, pp.Sample[1].NumLabel["goid"]) require.Equal(t, []string{"id"}, pp.Sample[1].NumUnit["goid"]) // Virtual frame for "frames elided" goroutine - require.Equal(t, 3, len(pp.Sample[2].Location)) + requireFunctions(t, pp.Sample[2], []string{ + "main.stackDump", + "main.main", + "...additional frames elided...", + }) // Virtual frame go "created by" frame - require.Equal(t, 2, len(pp.Sample[1].Location)) + requireFunctions(t, pp.Sample[1], []string{ + "time.Sleep", + "main.indirectShortSleepLoop2", + }) }) }