Skip to content

Commit

Permalink
runtime/pprof: set Function.start_line field
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Cherry Mui <[email protected]>
Run-TryBot: Michael Pratt <[email protected]>
Reviewed-by: Austin Clements <[email protected]>
  • Loading branch information
prattmic committed Oct 14, 2022
1 parent f2656f2 commit a401468
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 1 deletion.
9 changes: 8 additions & 1 deletion src/runtime/pprof/proto.go
Original file line number Diff line number Diff line change
Expand Up @@ -590,6 +590,7 @@ func (b *profileBuilder) emitLocation() uint64 {
type newFunc struct {
id uint64
name, file string
startLine int64
}
newFuncs := make([]newFunc, 0, 8)

Expand All @@ -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))
}
Expand All @@ -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)
}

Expand Down
4 changes: 4 additions & 0 deletions src/runtime/pprof/runtime.go
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
7 changes: 7 additions & 0 deletions src/runtime/symtab.go
Original file line number Diff line number Diff line change
Expand Up @@ -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.
//
Expand Down

0 comments on commit a401468

Please sign in to comment.