]> Cypherpunks.ru repositories - gostls13.git/commitdiff
runtime/pprof: set Function.start_line field
authorMichael Pratt <mpratt@google.com>
Fri, 30 Sep 2022 21:08:43 +0000 (17:08 -0400)
committerMichael Pratt <mpratt@google.com>
Fri, 14 Oct 2022 14:48:40 +0000 (14:48 +0000)
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 <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>
Reviewed-by: Austin Clements <austin@google.com>
src/runtime/pprof/proto.go
src/runtime/pprof/runtime.go
src/runtime/symtab.go

index e856c7643e91addccbfe59a39600149340776fb5..8a49e144b995bdd0c40ab5051088a094a8d63d56 100644 (file)
@@ -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)
        }
 
index dd2545b3390dbc6dcd150c3fad2502296cb30e32..57e9ca480bbae6d04418429a14e12d881c666ff7 100644 (file)
@@ -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
 
index 920ec12d54f9322ff4900e6d1a83cb32d4567ace..f47f96dd0f9a850abebf06418df2ae7731bcabd8 100644 (file)
@@ -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.
 //