From a401468b0092446d537edc2000c23e8015ce6b58 Mon Sep 17 00:00:00 2001 From: Michael Pratt Date: Fri, 30 Sep 2022 17:08:43 -0400 Subject: [PATCH] runtime/pprof: set Function.start_line field Now that we plumb the start line to the runtime, we can include in pprof files. Since runtime.Frame.startLine is not (currently) exported, we need a runtime helper to get the value. For #55022. Updates #56135. Change-Id: Ifc5b68a7b7170fd7895e4099deb24df7977b22ea Reviewed-on: https://go-review.googlesource.com/c/go/+/438255 TryBot-Result: Gopher Robot Reviewed-by: Cherry Mui Run-TryBot: Michael Pratt Reviewed-by: Austin Clements --- src/runtime/pprof/proto.go | 9 ++++++++- src/runtime/pprof/runtime.go | 4 ++++ src/runtime/symtab.go | 7 +++++++ 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/runtime/pprof/proto.go b/src/runtime/pprof/proto.go index e856c7643e..8a49e144b9 100644 --- a/src/runtime/pprof/proto.go +++ b/src/runtime/pprof/proto.go @@ -590,6 +590,7 @@ func (b *profileBuilder) emitLocation() uint64 { type newFunc struct { id uint64 name, file string + startLine int64 } newFuncs := make([]newFunc, 0, 8) @@ -610,7 +611,12 @@ func (b *profileBuilder) emitLocation() uint64 { if funcID == 0 { funcID = uint64(len(b.funcs)) + 1 b.funcs[frame.Function] = int(funcID) - newFuncs = append(newFuncs, newFunc{funcID, frame.Function, frame.File}) + newFuncs = append(newFuncs, newFunc{ + id: funcID, + name: frame.Function, + file: frame.File, + startLine: int64(runtime_FrameStartLine(&frame)), + }) } b.pbLine(tagLocation_Line, funcID, int64(frame.Line)) } @@ -633,6 +639,7 @@ func (b *profileBuilder) emitLocation() uint64 { b.pb.int64Opt(tagFunction_Name, b.stringIndex(fn.name)) b.pb.int64Opt(tagFunction_SystemName, b.stringIndex(fn.name)) b.pb.int64Opt(tagFunction_Filename, b.stringIndex(fn.file)) + b.pb.int64Opt(tagFunction_StartLine, fn.startLine) b.pb.endMessage(tagProfile_Function, start) } diff --git a/src/runtime/pprof/runtime.go b/src/runtime/pprof/runtime.go index dd2545b339..57e9ca480b 100644 --- a/src/runtime/pprof/runtime.go +++ b/src/runtime/pprof/runtime.go @@ -6,9 +6,13 @@ package pprof import ( "context" + "runtime" "unsafe" ) +// runtime_FrameStartLine is defined in runtime/symtab.go. +func runtime_FrameStartLine(f *runtime.Frame) int + // runtime_expandFinalInlineFrame is defined in runtime/symtab.go. func runtime_expandFinalInlineFrame(stk []uintptr) []uintptr diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 920ec12d54..f47f96dd0f 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -170,6 +170,13 @@ func (ci *Frames) Next() (frame Frame, more bool) { return } +// runtime_FrameStartLine returns the start line of the function in a Frame. +// +//go:linkname runtime_FrameStartLine runtime/pprof.runtime_FrameStartLine +func runtime_FrameStartLine(f *Frame) int { + return f.startLine +} + // runtime_expandFinalInlineFrame expands the final pc in stk to include all // "callers" if pc is inline. // -- 2.50.0