mirror of
https://github.com/golang/go
synced 2024-11-05 11:46:12 -07:00
Revert "cmd/vendor/github.com/google/pprof: refresh from upstream"
This reverts commit 3d13b5e00c
.
Reason for revert: the new TestHttpsInsecure test breaks two darwin builders, the android builders, and one plan9 builder.
Change-Id: I09158e7d1bd2b3ffda57e7f2350f34eb9b62e784
Reviewed-on: https://go-review.googlesource.com/46158
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
3d13b5e00c
commit
5a5ac34133
9
src/cmd/vendor/github.com/google/pprof/README.md
generated
vendored
9
src/cmd/vendor/github.com/google/pprof/README.md
generated
vendored
@ -1,6 +1,3 @@
|
|||||||
[![Build Status](https://travis-ci.org/google/pprof.svg?branch=master)](https://travis-ci.org/google/pprof)
|
|
||||||
[![codecov](https://codecov.io/gh/google/pprof/graph/badge.svg)](https://codecov.io/gh/google/pprof)
|
|
||||||
|
|
||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
pprof is a tool for visualization and analysis of profiling data.
|
pprof is a tool for visualization and analysis of profiling data.
|
||||||
@ -27,7 +24,7 @@ them through the use of the native binutils tools (addr2line and nm).
|
|||||||
|
|
||||||
Prerequisites:
|
Prerequisites:
|
||||||
|
|
||||||
- Go development kit. Requires Go 1.7 or newer.
|
- Go development kit. Known to work with Go 1.5.
|
||||||
Follow [these instructions](http://golang.org/doc/code.html) to install the
|
Follow [these instructions](http://golang.org/doc/code.html) to install the
|
||||||
go tool and set up GOPATH.
|
go tool and set up GOPATH.
|
||||||
|
|
||||||
@ -38,10 +35,6 @@ To build and install it, use the `go get` tool.
|
|||||||
|
|
||||||
go get github.com/google/pprof
|
go get github.com/google/pprof
|
||||||
|
|
||||||
Remember to set GOPATH to the directory where you want pprof to be
|
|
||||||
installed. The binary will be in $GOPATH/bin and the sources under
|
|
||||||
$GOPATH/src/github.com/google/pprof.
|
|
||||||
|
|
||||||
# Basic usage
|
# Basic usage
|
||||||
|
|
||||||
pprof can read a profile from a file or directly from a server via http.
|
pprof can read a profile from a file or directly from a server via http.
|
||||||
|
8
src/cmd/vendor/github.com/google/pprof/driver/driver.go
generated
vendored
8
src/cmd/vendor/github.com/google/pprof/driver/driver.go
generated
vendored
@ -29,10 +29,10 @@ import (
|
|||||||
// manager. Then it generates a report formatted according to the
|
// manager. Then it generates a report formatted according to the
|
||||||
// options selected through the flags package.
|
// options selected through the flags package.
|
||||||
func PProf(o *Options) error {
|
func PProf(o *Options) error {
|
||||||
return internaldriver.PProf(o.internalOptions())
|
return internaldriver.PProf(o.InternalOptions())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *Options) internalOptions() *plugin.Options {
|
func (o *Options) InternalOptions() *plugin.Options {
|
||||||
var obj plugin.ObjTool
|
var obj plugin.ObjTool
|
||||||
if o.Obj != nil {
|
if o.Obj != nil {
|
||||||
obj = &internalObjTool{o.Obj}
|
obj = &internalObjTool{o.Obj}
|
||||||
@ -273,9 +273,9 @@ type internalSymbolizer struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *internalSymbolizer) Symbolize(mode string, srcs plugin.MappingSources, prof *profile.Profile) error {
|
func (s *internalSymbolizer) Symbolize(mode string, srcs plugin.MappingSources, prof *profile.Profile) error {
|
||||||
isrcs := MappingSources{}
|
isrcs := plugin.MappingSources{}
|
||||||
for m, s := range srcs {
|
for m, s := range srcs {
|
||||||
isrcs[m] = s
|
isrcs[m] = s
|
||||||
}
|
}
|
||||||
return s.Symbolizer.Symbolize(mode, isrcs, prof)
|
return s.Symbolize(mode, isrcs, prof)
|
||||||
}
|
}
|
||||||
|
4
src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go
generated
vendored
4
src/cmd/vendor/github.com/google/pprof/internal/binutils/disasm_test.go
generated
vendored
@ -73,7 +73,7 @@ func TestFindSymbols(t *testing.T) {
|
|||||||
|
|
||||||
func checkSymbol(got []*plugin.Sym, want []plugin.Sym) error {
|
func checkSymbol(got []*plugin.Sym, want []plugin.Sym) error {
|
||||||
if len(got) != len(want) {
|
if len(got) != len(want) {
|
||||||
return fmt.Errorf("unexpected number of symbols %d (want %d)", len(got), len(want))
|
return fmt.Errorf("unexpected number of symbols %d (want %d)\n", len(got), len(want))
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, g := range got {
|
for i, g := range got {
|
||||||
@ -134,6 +134,8 @@ func TestFunctionAssembly(t *testing.T) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const objdump = "testdata/wrapper/objdump"
|
||||||
|
|
||||||
for _, tc := range testcases {
|
for _, tc := range testcases {
|
||||||
insts, err := disassemble([]byte(tc.asm))
|
insts, err := disassemble([]byte(tc.asm))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
5
src/cmd/vendor/github.com/google/pprof/internal/driver/commands.go
generated
vendored
5
src/cmd/vendor/github.com/google/pprof/internal/driver/commands.go
generated
vendored
@ -227,6 +227,9 @@ var pprofVariables = variables{
|
|||||||
"functions": &variable{boolKind, "t", "granularity", helpText(
|
"functions": &variable{boolKind, "t", "granularity", helpText(
|
||||||
"Aggregate at the function level.",
|
"Aggregate at the function level.",
|
||||||
"Takes into account the filename/lineno where the function was defined.")},
|
"Takes into account the filename/lineno where the function was defined.")},
|
||||||
|
"functionnameonly": &variable{boolKind, "f", "granularity", helpText(
|
||||||
|
"Aggregate at the function level.",
|
||||||
|
"Ignores the filename/lineno where the function was defined.")},
|
||||||
"files": &variable{boolKind, "f", "granularity", "Aggregate at the file level."},
|
"files": &variable{boolKind, "f", "granularity", "Aggregate at the file level."},
|
||||||
"lines": &variable{boolKind, "f", "granularity", "Aggregate at the source code line level."},
|
"lines": &variable{boolKind, "f", "granularity", "Aggregate at the source code line level."},
|
||||||
"addresses": &variable{boolKind, "f", "granularity", helpText(
|
"addresses": &variable{boolKind, "f", "granularity", helpText(
|
||||||
@ -468,7 +471,7 @@ func (vars variables) set(name, value string) error {
|
|||||||
case boolKind:
|
case boolKind:
|
||||||
var b bool
|
var b bool
|
||||||
if b, err = stringToBool(value); err == nil {
|
if b, err = stringToBool(value); err == nil {
|
||||||
if v.group != "" && !b {
|
if v.group != "" && b == false {
|
||||||
err = fmt.Errorf("%q can only be set to true", name)
|
err = fmt.Errorf("%q can only be set to true", name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
13
src/cmd/vendor/github.com/google/pprof/internal/driver/driver.go
generated
vendored
13
src/cmd/vendor/github.com/google/pprof/internal/driver/driver.go
generated
vendored
@ -160,20 +160,20 @@ func applyCommandOverrides(cmd []string, v variables) variables {
|
|||||||
v.set("nodecount", "80")
|
v.set("nodecount", "80")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !trim {
|
if trim == false {
|
||||||
v.set("nodecount", "0")
|
v.set("nodecount", "0")
|
||||||
v.set("nodefraction", "0")
|
v.set("nodefraction", "0")
|
||||||
v.set("edgefraction", "0")
|
v.set("edgefraction", "0")
|
||||||
}
|
}
|
||||||
if !focus {
|
if focus == false {
|
||||||
v.set("focus", "")
|
v.set("focus", "")
|
||||||
v.set("ignore", "")
|
v.set("ignore", "")
|
||||||
}
|
}
|
||||||
if !tagfocus {
|
if tagfocus == false {
|
||||||
v.set("tagfocus", "")
|
v.set("tagfocus", "")
|
||||||
v.set("tagignore", "")
|
v.set("tagignore", "")
|
||||||
}
|
}
|
||||||
if !hide {
|
if hide == false {
|
||||||
v.set("hide", "")
|
v.set("hide", "")
|
||||||
v.set("show", "")
|
v.set("show", "")
|
||||||
}
|
}
|
||||||
@ -196,13 +196,18 @@ func aggregate(prof *profile.Profile, v variables) error {
|
|||||||
case v["functions"].boolValue():
|
case v["functions"].boolValue():
|
||||||
inlines = true
|
inlines = true
|
||||||
function = true
|
function = true
|
||||||
|
filename = true
|
||||||
case v["noinlines"].boolValue():
|
case v["noinlines"].boolValue():
|
||||||
function = true
|
function = true
|
||||||
|
filename = true
|
||||||
case v["addressnoinlines"].boolValue():
|
case v["addressnoinlines"].boolValue():
|
||||||
function = true
|
function = true
|
||||||
filename = true
|
filename = true
|
||||||
linenumber = true
|
linenumber = true
|
||||||
address = true
|
address = true
|
||||||
|
case v["functionnameonly"].boolValue():
|
||||||
|
inlines = true
|
||||||
|
function = true
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unexpected granularity")
|
return fmt.Errorf("unexpected granularity")
|
||||||
}
|
}
|
||||||
|
2
src/cmd/vendor/github.com/google/pprof/internal/driver/driver_focus.go
generated
vendored
2
src/cmd/vendor/github.com/google/pprof/internal/driver/driver_focus.go
generated
vendored
@ -59,7 +59,7 @@ func applyFocus(prof *profile.Profile, v variables, ui plugin.UI) error {
|
|||||||
if prunefrom != nil {
|
if prunefrom != nil {
|
||||||
prof.PruneFrom(prunefrom)
|
prof.PruneFrom(prunefrom)
|
||||||
}
|
}
|
||||||
return err
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func compileRegexOption(name, value string, err error) (*regexp.Regexp, error) {
|
func compileRegexOption(name, value string, err error) (*regexp.Regexp, error) {
|
||||||
|
127
src/cmd/vendor/github.com/google/pprof/internal/driver/driver_test.go
generated
vendored
127
src/cmd/vendor/github.com/google/pprof/internal/driver/driver_test.go
generated
vendored
@ -16,11 +16,8 @@ package driver
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"flag"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net"
|
|
||||||
_ "net/http/pprof"
|
|
||||||
"os"
|
"os"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -35,8 +32,6 @@ import (
|
|||||||
"github.com/google/pprof/profile"
|
"github.com/google/pprof/profile"
|
||||||
)
|
)
|
||||||
|
|
||||||
var updateFlag = flag.Bool("update", false, "Update the golden files")
|
|
||||||
|
|
||||||
func TestParse(t *testing.T) {
|
func TestParse(t *testing.T) {
|
||||||
// Override weblist command to collect output in buffer
|
// Override weblist command to collect output in buffer
|
||||||
pprofCommands["weblist"].postProcess = nil
|
pprofCommands["weblist"].postProcess = nil
|
||||||
@ -48,12 +43,13 @@ func TestParse(t *testing.T) {
|
|||||||
savePath := os.Getenv("PPROF_BINARY_PATH")
|
savePath := os.Getenv("PPROF_BINARY_PATH")
|
||||||
os.Setenv("PPROF_BINARY_PATH", "/path/to")
|
os.Setenv("PPROF_BINARY_PATH", "/path/to")
|
||||||
defer os.Setenv("PPROF_BINARY_PATH", savePath)
|
defer os.Setenv("PPROF_BINARY_PATH", savePath)
|
||||||
|
|
||||||
testcase := []struct {
|
testcase := []struct {
|
||||||
flags, source string
|
flags, source string
|
||||||
}{
|
}{
|
||||||
{"text,functions,flat", "cpu"},
|
{"text,functions,flat", "cpu"},
|
||||||
{"tree,addresses,flat,nodecount=4", "cpusmall"},
|
{"tree,addresses,flat,nodecount=4", "cpusmall"},
|
||||||
{"text,functions,flat,nodecount=5,call_tree", "unknown"},
|
{"text,functions,flat", "unknown"},
|
||||||
{"text,alloc_objects,flat", "heap_alloc"},
|
{"text,alloc_objects,flat", "heap_alloc"},
|
||||||
{"text,files,flat", "heap"},
|
{"text,files,flat", "heap"},
|
||||||
{"text,inuse_objects,flat", "heap"},
|
{"text,inuse_objects,flat", "heap"},
|
||||||
@ -63,10 +59,8 @@ func TestParse(t *testing.T) {
|
|||||||
{"tree,lines,cum,focus=[24]00", "heap"},
|
{"tree,lines,cum,focus=[24]00", "heap"},
|
||||||
{"tree,relative_percentages,cum,focus=[24]00", "heap"},
|
{"tree,relative_percentages,cum,focus=[24]00", "heap"},
|
||||||
{"callgrind", "cpu"},
|
{"callgrind", "cpu"},
|
||||||
{"callgrind,call_tree", "cpu"},
|
|
||||||
{"callgrind", "heap"},
|
{"callgrind", "heap"},
|
||||||
{"dot,functions,flat", "cpu"},
|
{"dot,functions,flat", "cpu"},
|
||||||
{"dot,functions,flat,call_tree", "cpu"},
|
|
||||||
{"dot,lines,flat,focus=[12]00", "heap"},
|
{"dot,lines,flat,focus=[12]00", "heap"},
|
||||||
{"dot,addresses,flat,ignore=[X3]002,focus=[X1]000", "contention"},
|
{"dot,addresses,flat,ignore=[X3]002,focus=[X1]000", "contention"},
|
||||||
{"dot,files,cum", "contention"},
|
{"dot,files,cum", "contention"},
|
||||||
@ -105,7 +99,6 @@ func TestParse(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("cannot create tempfile: %v", err)
|
t.Errorf("cannot create tempfile: %v", err)
|
||||||
}
|
}
|
||||||
defer os.Remove(protoTempFile.Name())
|
|
||||||
defer protoTempFile.Close()
|
defer protoTempFile.Close()
|
||||||
f.strings["output"] = protoTempFile.Name()
|
f.strings["output"] = protoTempFile.Name()
|
||||||
|
|
||||||
@ -131,7 +124,6 @@ func TestParse(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Errorf("cannot create tempfile: %v", err)
|
t.Errorf("cannot create tempfile: %v", err)
|
||||||
}
|
}
|
||||||
defer os.Remove(outputTempFile.Name())
|
|
||||||
defer outputTempFile.Close()
|
defer outputTempFile.Close()
|
||||||
f.strings["output"] = outputTempFile.Name()
|
f.strings["output"] = outputTempFile.Name()
|
||||||
f.args = []string{protoTempFile.Name()}
|
f.args = []string{protoTempFile.Name()}
|
||||||
@ -188,12 +180,6 @@ func TestParse(t *testing.T) {
|
|||||||
t.Fatalf("diff %s %v", solution, err)
|
t.Fatalf("diff %s %v", solution, err)
|
||||||
}
|
}
|
||||||
t.Errorf("%s\n%s\n", solution, d)
|
t.Errorf("%s\n%s\n", solution, d)
|
||||||
if *updateFlag {
|
|
||||||
err := ioutil.WriteFile(solution, b, 0644)
|
|
||||||
if err != nil {
|
|
||||||
t.Errorf("failed to update the solution file %q: %v", solution, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,19 +214,14 @@ func addFlags(f *testFlags, flags []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func testSourceURL(port int) string {
|
|
||||||
return fmt.Sprintf("http://%s/", net.JoinHostPort(testSourceAddress, strconv.Itoa(port)))
|
|
||||||
}
|
|
||||||
|
|
||||||
// solutionFilename returns the name of the solution file for the test
|
// solutionFilename returns the name of the solution file for the test
|
||||||
func solutionFilename(source string, f *testFlags) string {
|
func solutionFilename(source string, f *testFlags) string {
|
||||||
name := []string{"pprof", strings.TrimPrefix(source, testSourceURL(8000))}
|
name := []string{"pprof", strings.TrimPrefix(source, "http://host:8000/")}
|
||||||
name = addString(name, f, []string{"flat", "cum"})
|
name = addString(name, f, []string{"flat", "cum"})
|
||||||
name = addString(name, f, []string{"functions", "files", "lines", "addresses"})
|
name = addString(name, f, []string{"functions", "files", "lines", "addresses"})
|
||||||
name = addString(name, f, []string{"inuse_space", "inuse_objects", "alloc_space", "alloc_objects"})
|
name = addString(name, f, []string{"inuse_space", "inuse_objects", "alloc_space", "alloc_objects"})
|
||||||
name = addString(name, f, []string{"relative_percentages"})
|
name = addString(name, f, []string{"relative_percentages"})
|
||||||
name = addString(name, f, []string{"seconds"})
|
name = addString(name, f, []string{"seconds"})
|
||||||
name = addString(name, f, []string{"call_tree"})
|
|
||||||
name = addString(name, f, []string{"text", "tree", "callgrind", "dot", "svg", "tags", "dot", "traces", "disasm", "peek", "weblist", "topproto", "comments"})
|
name = addString(name, f, []string{"text", "tree", "callgrind", "dot", "svg", "tags", "dot", "traces", "disasm", "peek", "weblist", "topproto", "comments"})
|
||||||
if f.strings["focus"] != "" || f.strings["tagfocus"] != "" {
|
if f.strings["focus"] != "" || f.strings["tagfocus"] != "" {
|
||||||
name = append(name, "focus")
|
name = append(name, "focus")
|
||||||
@ -364,6 +345,9 @@ func baseFlags() testFlags {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type testProfile struct {
|
||||||
|
}
|
||||||
|
|
||||||
const testStart = 0x1000
|
const testStart = 0x1000
|
||||||
const testOffset = 0x5000
|
const testOffset = 0x5000
|
||||||
|
|
||||||
@ -371,6 +355,7 @@ type testFetcher struct{}
|
|||||||
|
|
||||||
func (testFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) {
|
func (testFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) {
|
||||||
var p *profile.Profile
|
var p *profile.Profile
|
||||||
|
s = strings.TrimPrefix(s, "http://host:8000/")
|
||||||
switch s {
|
switch s {
|
||||||
case "cpu", "unknown":
|
case "cpu", "unknown":
|
||||||
p = cpuProfile()
|
p = cpuProfile()
|
||||||
@ -388,10 +373,17 @@ func (testFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string
|
|||||||
p = contentionProfile()
|
p = contentionProfile()
|
||||||
case "symbolz":
|
case "symbolz":
|
||||||
p = symzProfile()
|
p = symzProfile()
|
||||||
|
case "http://host2/symbolz":
|
||||||
|
p = symzProfile()
|
||||||
|
p.Mapping[0].Start += testOffset
|
||||||
|
p.Mapping[0].Limit += testOffset
|
||||||
|
for i := range p.Location {
|
||||||
|
p.Location[i].Address += testOffset
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
return nil, "", fmt.Errorf("unexpected source: %s", s)
|
return nil, "", fmt.Errorf("unexpected source: %s", s)
|
||||||
}
|
}
|
||||||
return p, testSourceURL(8000) + s, nil
|
return p, s, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type testSymbolizer struct{}
|
type testSymbolizer struct{}
|
||||||
@ -414,19 +406,7 @@ func (testSymbolizeDemangler) Symbolize(_ string, _ plugin.MappingSources, p *pr
|
|||||||
func testFetchSymbols(source, post string) ([]byte, error) {
|
func testFetchSymbols(source, post string) ([]byte, error) {
|
||||||
var buf bytes.Buffer
|
var buf bytes.Buffer
|
||||||
|
|
||||||
switch source {
|
if source == "http://host2/symbolz" {
|
||||||
case testSourceURL(8000) + "symbolz":
|
|
||||||
for _, address := range strings.Split(post, "+") {
|
|
||||||
a, _ := strconv.ParseInt(address, 0, 64)
|
|
||||||
fmt.Fprintf(&buf, "%v\t", address)
|
|
||||||
if a-testStart > testOffset {
|
|
||||||
fmt.Fprintf(&buf, "wrong_source_%v_", address)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
fmt.Fprintf(&buf, "%#x\n", a-testStart)
|
|
||||||
}
|
|
||||||
return buf.Bytes(), nil
|
|
||||||
case testSourceURL(8001) + "symbolz":
|
|
||||||
for _, address := range strings.Split(post, "+") {
|
for _, address := range strings.Split(post, "+") {
|
||||||
a, _ := strconv.ParseInt(address, 0, 64)
|
a, _ := strconv.ParseInt(address, 0, 64)
|
||||||
fmt.Fprintf(&buf, "%v\t", address)
|
fmt.Fprintf(&buf, "%v\t", address)
|
||||||
@ -437,9 +417,17 @@ func testFetchSymbols(source, post string) ([]byte, error) {
|
|||||||
fmt.Fprintf(&buf, "%#x\n", a-testStart-testOffset)
|
fmt.Fprintf(&buf, "%#x\n", a-testStart-testOffset)
|
||||||
}
|
}
|
||||||
return buf.Bytes(), nil
|
return buf.Bytes(), nil
|
||||||
default:
|
|
||||||
return nil, fmt.Errorf("unexpected source: %s", source)
|
|
||||||
}
|
}
|
||||||
|
for _, address := range strings.Split(post, "+") {
|
||||||
|
a, _ := strconv.ParseInt(address, 0, 64)
|
||||||
|
fmt.Fprintf(&buf, "%v\t", address)
|
||||||
|
if a-testStart > testOffset {
|
||||||
|
fmt.Fprintf(&buf, "wrong_source_%v_", address)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
fmt.Fprintf(&buf, "%#x\n", a-testStart)
|
||||||
|
}
|
||||||
|
return buf.Bytes(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type testSymbolzSymbolizer struct{}
|
type testSymbolzSymbolizer struct{}
|
||||||
@ -555,32 +543,32 @@ func cpuProfile() *profile.Profile {
|
|||||||
Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]},
|
Location: []*profile.Location{cpuL[0], cpuL[1], cpuL[2]},
|
||||||
Value: []int64{1000, 1000},
|
Value: []int64{1000, 1000},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag1"},
|
"key1": []string{"tag1"},
|
||||||
"key2": {"tag1"},
|
"key2": []string{"tag1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{cpuL[0], cpuL[3]},
|
Location: []*profile.Location{cpuL[0], cpuL[3]},
|
||||||
Value: []int64{100, 100},
|
Value: []int64{100, 100},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag2"},
|
"key1": []string{"tag2"},
|
||||||
"key3": {"tag2"},
|
"key3": []string{"tag2"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{cpuL[1], cpuL[4]},
|
Location: []*profile.Location{cpuL[1], cpuL[4]},
|
||||||
Value: []int64{10, 10},
|
Value: []int64{10, 10},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag3"},
|
"key1": []string{"tag3"},
|
||||||
"key2": {"tag2"},
|
"key2": []string{"tag2"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{cpuL[2]},
|
Location: []*profile.Location{cpuL[2]},
|
||||||
Value: []int64{10, 10},
|
Value: []int64{10, 10},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag4"},
|
"key1": []string{"tag4"},
|
||||||
"key2": {"tag1"},
|
"key2": []string{"tag1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -757,28 +745,28 @@ func heapProfile() *profile.Profile {
|
|||||||
Location: []*profile.Location{heapL[0], heapL[1], heapL[2]},
|
Location: []*profile.Location{heapL[0], heapL[1], heapL[2]},
|
||||||
Value: []int64{10, 1024000},
|
Value: []int64{10, 1024000},
|
||||||
NumLabel: map[string][]int64{
|
NumLabel: map[string][]int64{
|
||||||
"bytes": {102400},
|
"bytes": []int64{102400},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{heapL[0], heapL[3]},
|
Location: []*profile.Location{heapL[0], heapL[3]},
|
||||||
Value: []int64{20, 4096000},
|
Value: []int64{20, 4096000},
|
||||||
NumLabel: map[string][]int64{
|
NumLabel: map[string][]int64{
|
||||||
"bytes": {204800},
|
"bytes": []int64{204800},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{heapL[1], heapL[4]},
|
Location: []*profile.Location{heapL[1], heapL[4]},
|
||||||
Value: []int64{40, 65536000},
|
Value: []int64{40, 65536000},
|
||||||
NumLabel: map[string][]int64{
|
NumLabel: map[string][]int64{
|
||||||
"bytes": {1638400},
|
"bytes": []int64{1638400},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*profile.Location{heapL[2]},
|
Location: []*profile.Location{heapL[2]},
|
||||||
Value: []int64{80, 32768000},
|
Value: []int64{80, 32768000},
|
||||||
NumLabel: map[string][]int64{
|
NumLabel: map[string][]int64{
|
||||||
"bytes": {409600},
|
"bytes": []int64{409600},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -989,36 +977,13 @@ func TestTagFilter(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type testSymbolzMergeFetcher struct{}
|
|
||||||
|
|
||||||
func (testSymbolzMergeFetcher) Fetch(s string, d, t time.Duration) (*profile.Profile, string, error) {
|
|
||||||
var p *profile.Profile
|
|
||||||
switch s {
|
|
||||||
case testSourceURL(8000) + "symbolz":
|
|
||||||
p = symzProfile()
|
|
||||||
case testSourceURL(8001) + "symbolz":
|
|
||||||
p = symzProfile()
|
|
||||||
p.Mapping[0].Start += testOffset
|
|
||||||
p.Mapping[0].Limit += testOffset
|
|
||||||
for i := range p.Location {
|
|
||||||
p.Location[i].Address += testOffset
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
return nil, "", fmt.Errorf("unexpected source: %s", s)
|
|
||||||
}
|
|
||||||
return p, s, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestSymbolzAfterMerge(t *testing.T) {
|
func TestSymbolzAfterMerge(t *testing.T) {
|
||||||
baseVars := pprofVariables
|
baseVars := pprofVariables
|
||||||
pprofVariables = baseVars.makeCopy()
|
pprofVariables = baseVars.makeCopy()
|
||||||
defer func() { pprofVariables = baseVars }()
|
defer func() { pprofVariables = baseVars }()
|
||||||
|
|
||||||
f := baseFlags()
|
f := baseFlags()
|
||||||
f.args = []string{
|
f.args = []string{"symbolz", "http://host2/symbolz"}
|
||||||
testSourceURL(8000) + "symbolz",
|
|
||||||
testSourceURL(8001) + "symbolz",
|
|
||||||
}
|
|
||||||
|
|
||||||
o := setDefaults(nil)
|
o := setDefaults(nil)
|
||||||
o.Flagset = f
|
o.Flagset = f
|
||||||
@ -1032,7 +997,7 @@ func TestSymbolzAfterMerge(t *testing.T) {
|
|||||||
t.Fatalf("parseFlags returned command %v, want [proto]", cmd)
|
t.Fatalf("parseFlags returned command %v, want [proto]", cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
o.Fetch = testSymbolzMergeFetcher{}
|
o.Fetch = testFetcher{}
|
||||||
o.Sym = testSymbolzSymbolizer{}
|
o.Sym = testSymbolzSymbolizer{}
|
||||||
p, err := fetchProfiles(src, o)
|
p, err := fetchProfiles(src, o)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -1063,10 +1028,10 @@ func (m *mockObjTool) Disasm(file string, start, end uint64) ([]plugin.Inst, err
|
|||||||
switch start {
|
switch start {
|
||||||
case 0x1000:
|
case 0x1000:
|
||||||
return []plugin.Inst{
|
return []plugin.Inst{
|
||||||
{Addr: 0x1000, Text: "instruction one", File: "file1000.src", Line: 1},
|
{Addr: 0x1000, Text: "instruction one"},
|
||||||
{Addr: 0x1001, Text: "instruction two", File: "file1000.src", Line: 1},
|
{Addr: 0x1001, Text: "instruction two"},
|
||||||
{Addr: 0x1002, Text: "instruction three", File: "file1000.src", Line: 2},
|
{Addr: 0x1002, Text: "instruction three"},
|
||||||
{Addr: 0x1003, Text: "instruction four", File: "file1000.src", Line: 1},
|
{Addr: 0x1003, Text: "instruction four"},
|
||||||
}, nil
|
}, nil
|
||||||
case 0x3000:
|
case 0x3000:
|
||||||
return []plugin.Inst{
|
return []plugin.Inst{
|
||||||
@ -1081,7 +1046,7 @@ func (m *mockObjTool) Disasm(file string, start, end uint64) ([]plugin.Inst, err
|
|||||||
}
|
}
|
||||||
|
|
||||||
type mockFile struct {
|
type mockFile struct {
|
||||||
name, buildID string
|
name, buildId string
|
||||||
base uint64
|
base uint64
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1097,7 +1062,7 @@ func (m *mockFile) Base() uint64 {
|
|||||||
|
|
||||||
// BuildID returns the GNU build ID of the file, or an empty string.
|
// BuildID returns the GNU build ID of the file, or an empty string.
|
||||||
func (m *mockFile) BuildID() string {
|
func (m *mockFile) BuildID() string {
|
||||||
return m.buildID
|
return m.buildId
|
||||||
}
|
}
|
||||||
|
|
||||||
// SourceLine reports the source line information for a given
|
// SourceLine reports the source line information for a given
|
||||||
|
29
src/cmd/vendor/github.com/google/pprof/internal/driver/fetch.go
generated
vendored
29
src/cmd/vendor/github.com/google/pprof/internal/driver/fetch.go
generated
vendored
@ -242,8 +242,6 @@ func setTmpDir(ui plugin.UI) (string, error) {
|
|||||||
return "", fmt.Errorf("failed to identify temp dir")
|
return "", fmt.Errorf("failed to identify temp dir")
|
||||||
}
|
}
|
||||||
|
|
||||||
const testSourceAddress = "pproftest.local"
|
|
||||||
|
|
||||||
// grabProfile fetches a profile. Returns the profile, sources for the
|
// grabProfile fetches a profile. Returns the profile, sources for the
|
||||||
// profile mappings, a bool indicating if the profile was fetched
|
// profile mappings, a bool indicating if the profile was fetched
|
||||||
// remotely, and an error.
|
// remotely, and an error.
|
||||||
@ -278,11 +276,6 @@ func grabProfile(s *source, source string, scale float64, fetcher plugin.Fetcher
|
|||||||
if src != "" {
|
if src != "" {
|
||||||
msrc = collectMappingSources(p, src)
|
msrc = collectMappingSources(p, src)
|
||||||
remote = true
|
remote = true
|
||||||
if strings.HasPrefix(src, "http://"+testSourceAddress) {
|
|
||||||
// Treat test inputs as local to avoid saving
|
|
||||||
// testcase profiles during driver testing.
|
|
||||||
remote = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -373,20 +366,20 @@ mapping:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if len(p.Mapping) == 0 {
|
|
||||||
// If there are no mappings, add a fake mapping to attempt symbolization.
|
|
||||||
// This is useful for some profiles generated by the golang runtime, which
|
|
||||||
// do not include any mappings. Symbolization with a fake mapping will only
|
|
||||||
// be successful against a non-PIE binary.
|
|
||||||
m := &profile.Mapping{ID: 1}
|
|
||||||
p.Mapping = []*profile.Mapping{m}
|
|
||||||
for _, l := range p.Location {
|
|
||||||
l.Mapping = m
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Replace executable filename/buildID with the overrides from source.
|
// Replace executable filename/buildID with the overrides from source.
|
||||||
// Assumes the executable is the first Mapping entry.
|
// Assumes the executable is the first Mapping entry.
|
||||||
if execName, buildID := s.ExecName, s.BuildID; execName != "" || buildID != "" {
|
if execName, buildID := s.ExecName, s.BuildID; execName != "" || buildID != "" {
|
||||||
|
if len(p.Mapping) == 0 {
|
||||||
|
// If there are no mappings, add a fake mapping to attempt symbolization.
|
||||||
|
// This is useful for some profiles generated by the golang runtime, which
|
||||||
|
// do not include any mappings. Symbolization with a fake mapping will only
|
||||||
|
// be successful against a non-PIE binary.
|
||||||
|
m := &profile.Mapping{ID: 1}
|
||||||
|
p.Mapping = []*profile.Mapping{m}
|
||||||
|
for _, l := range p.Location {
|
||||||
|
l.Mapping = m
|
||||||
|
}
|
||||||
|
}
|
||||||
m := p.Mapping[0]
|
m := p.Mapping[0]
|
||||||
if execName != "" {
|
if execName != "" {
|
||||||
m.File = execName
|
m.File = execName
|
||||||
|
117
src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go
generated
vendored
117
src/cmd/vendor/github.com/google/pprof/internal/driver/fetch_test.go
generated
vendored
@ -15,15 +15,8 @@
|
|||||||
package driver
|
package driver
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/ecdsa"
|
|
||||||
"crypto/elliptic"
|
|
||||||
"crypto/rand"
|
|
||||||
"crypto/tls"
|
|
||||||
"crypto/x509"
|
|
||||||
"encoding/pem"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"math/big"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
@ -31,14 +24,11 @@ import (
|
|||||||
"reflect"
|
"reflect"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
"strings"
|
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/pprof/internal/binutils"
|
|
||||||
"github.com/google/pprof/internal/plugin"
|
"github.com/google/pprof/internal/plugin"
|
||||||
"github.com/google/pprof/internal/proftest"
|
"github.com/google/pprof/internal/proftest"
|
||||||
"github.com/google/pprof/internal/symbolizer"
|
|
||||||
"github.com/google/pprof/profile"
|
"github.com/google/pprof/profile"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -175,8 +165,6 @@ func TestFetch(t *testing.T) {
|
|||||||
const path = "testdata/"
|
const path = "testdata/"
|
||||||
|
|
||||||
// Intercept http.Get calls from HTTPFetcher.
|
// Intercept http.Get calls from HTTPFetcher.
|
||||||
savedHTTPGet := httpGet
|
|
||||||
defer func() { httpGet = savedHTTPGet }()
|
|
||||||
httpGet = stubHTTPGet
|
httpGet = stubHTTPGet
|
||||||
|
|
||||||
type testcase struct {
|
type testcase struct {
|
||||||
@ -239,108 +227,3 @@ func stubHTTPGet(source string, _ time.Duration) (*http.Response, error) {
|
|||||||
c := &http.Client{Transport: t}
|
c := &http.Client{Transport: t}
|
||||||
return c.Get("file:///" + file)
|
return c.Get("file:///" + file)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestHttpsInsecure(t *testing.T) {
|
|
||||||
|
|
||||||
if runtime.GOOS == "nacl" {
|
|
||||||
t.Skip("test assumes tcp available")
|
|
||||||
}
|
|
||||||
|
|
||||||
baseVars := pprofVariables
|
|
||||||
pprofVariables = baseVars.makeCopy()
|
|
||||||
defer func() { pprofVariables = baseVars }()
|
|
||||||
|
|
||||||
tlsConfig := &tls.Config{Certificates: []tls.Certificate{selfSignedCert(t)}}
|
|
||||||
|
|
||||||
l, err := tls.Listen("tcp", "localhost:0", tlsConfig)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("net.Listen: got error %v, want no error", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
donec := make(chan error, 1)
|
|
||||||
go func(donec chan<- error) {
|
|
||||||
donec <- http.Serve(l, nil)
|
|
||||||
}(donec)
|
|
||||||
defer func() {
|
|
||||||
if got, want := <-donec, "use of closed"; !strings.Contains(got.Error(), want) {
|
|
||||||
t.Fatalf("Serve got error %v, want %q", got, want)
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
defer l.Close()
|
|
||||||
|
|
||||||
go func() {
|
|
||||||
deadline := time.Now().Add(5 * time.Second)
|
|
||||||
for time.Now().Before(deadline) {
|
|
||||||
// Simulate a hotspot function.
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
outputTempFile, err := ioutil.TempFile("", "profile_output")
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("Failed to create tempfile: %v", err)
|
|
||||||
}
|
|
||||||
defer os.Remove(outputTempFile.Name())
|
|
||||||
defer outputTempFile.Close()
|
|
||||||
|
|
||||||
address := "https+insecure://" + l.Addr().String() + "/debug/pprof/profile"
|
|
||||||
s := &source{
|
|
||||||
Sources: []string{address},
|
|
||||||
Seconds: 10,
|
|
||||||
Timeout: 10,
|
|
||||||
Symbolize: "remote",
|
|
||||||
}
|
|
||||||
o := &plugin.Options{
|
|
||||||
Obj: &binutils.Binutils{},
|
|
||||||
UI: &proftest.TestUI{T: t, IgnoreRx: "Saved profile in"},
|
|
||||||
}
|
|
||||||
o.Sym = &symbolizer.Symbolizer{Obj: o.Obj, UI: o.UI}
|
|
||||||
p, err := fetchProfiles(s, o)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal(err)
|
|
||||||
}
|
|
||||||
if len(p.SampleType) == 0 {
|
|
||||||
t.Fatalf("grabProfile(%s) got empty profile: len(p.SampleType)==0", address)
|
|
||||||
}
|
|
||||||
if err := checkProfileHasFunction(p, "TestHttpsInsecure"); err != nil {
|
|
||||||
t.Fatalf("grabProfile(%s) %v", address, err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkProfileHasFunction(p *profile.Profile, fname string) error {
|
|
||||||
for _, f := range p.Function {
|
|
||||||
if strings.Contains(f.Name, fname) {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return fmt.Errorf("got %s, want function %q", p.String(), fname)
|
|
||||||
}
|
|
||||||
|
|
||||||
func selfSignedCert(t *testing.T) tls.Certificate {
|
|
||||||
privKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to generate private key: %v", err)
|
|
||||||
}
|
|
||||||
b, err := x509.MarshalECPrivateKey(privKey)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to marshal private key: %v", err)
|
|
||||||
}
|
|
||||||
bk := pem.EncodeToMemory(&pem.Block{Type: "EC PRIVATE KEY", Bytes: b})
|
|
||||||
|
|
||||||
tmpl := x509.Certificate{
|
|
||||||
SerialNumber: big.NewInt(1),
|
|
||||||
NotBefore: time.Now(),
|
|
||||||
NotAfter: time.Now().Add(10 * time.Minute),
|
|
||||||
}
|
|
||||||
|
|
||||||
b, err = x509.CreateCertificate(rand.Reader, &tmpl, &tmpl, privKey.Public(), privKey)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create cert: %v", err)
|
|
||||||
}
|
|
||||||
bc := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: b})
|
|
||||||
|
|
||||||
cert, err := tls.X509KeyPair(bc, bk)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create TLS key pair: %v", err)
|
|
||||||
}
|
|
||||||
return cert
|
|
||||||
}
|
|
||||||
|
@ -1,99 +0,0 @@
|
|||||||
positions: instr line
|
|
||||||
events: cpu(ms)
|
|
||||||
|
|
||||||
ob=(1) /path/to/testbinary
|
|
||||||
fl=(1) testdata/file1000.src
|
|
||||||
fn=(1) line1000
|
|
||||||
0x1000 1 1000
|
|
||||||
* 1 100
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(2) testdata/file2000.src
|
|
||||||
fn=(2) line2001
|
|
||||||
+4096 9 10
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3) testdata/file3000.src
|
|
||||||
fn=(3) line3002
|
|
||||||
+4096 2 10
|
|
||||||
cfl=(2)
|
|
||||||
cfn=(4) line2000 [1/2]
|
|
||||||
calls=0 * 4
|
|
||||||
* * 1000
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(2)
|
|
||||||
fn=(5) line2000
|
|
||||||
-4096 4 0
|
|
||||||
cfl=(2)
|
|
||||||
cfn=(6) line2001 [2/2]
|
|
||||||
calls=0 -4096 9
|
|
||||||
* * 1000
|
|
||||||
* 4 0
|
|
||||||
cfl=(2)
|
|
||||||
cfn=(7) line2001 [1/2]
|
|
||||||
calls=0 * 9
|
|
||||||
* * 10
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(2)
|
|
||||||
fn=(2)
|
|
||||||
* 9 0
|
|
||||||
cfl=(1)
|
|
||||||
cfn=(8) line1000 [1/2]
|
|
||||||
calls=0 -4096 1
|
|
||||||
* * 1000
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(9) line3000
|
|
||||||
+4096 6 0
|
|
||||||
cfl=(3)
|
|
||||||
cfn=(10) line3001 [1/2]
|
|
||||||
calls=0 +4096 5
|
|
||||||
* * 1010
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(11) line3001
|
|
||||||
* 5 0
|
|
||||||
cfl=(3)
|
|
||||||
cfn=(12) line3002 [1/2]
|
|
||||||
calls=0 * 2
|
|
||||||
* * 1010
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(9)
|
|
||||||
+1 9 0
|
|
||||||
cfl=(3)
|
|
||||||
cfn=(13) line3001 [2/2]
|
|
||||||
calls=0 +1 8
|
|
||||||
* * 100
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(11)
|
|
||||||
* 8 0
|
|
||||||
cfl=(1)
|
|
||||||
cfn=(14) line1000 [2/2]
|
|
||||||
calls=0 -8193 1
|
|
||||||
* * 100
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(9)
|
|
||||||
+1 9 0
|
|
||||||
cfl=(3)
|
|
||||||
cfn=(15) line3002 [2/2]
|
|
||||||
calls=0 +1 5
|
|
||||||
* * 10
|
|
||||||
|
|
||||||
ob=(1)
|
|
||||||
fl=(3)
|
|
||||||
fn=(3)
|
|
||||||
* 5 0
|
|
||||||
cfl=(2)
|
|
||||||
cfn=(16) line2000 [2/2]
|
|
||||||
calls=0 -4098 4
|
|
||||||
* * 10
|
|
@ -2,9 +2,9 @@ Total: 1.12s
|
|||||||
ROUTINE ======================== line1000
|
ROUTINE ======================== line1000
|
||||||
1.10s 1.10s (flat, cum) 98.21% of Total
|
1.10s 1.10s (flat, cum) 98.21% of Total
|
||||||
1.10s 1.10s 1000: instruction one ;line1000 file1000.src:1
|
1.10s 1.10s 1000: instruction one ;line1000 file1000.src:1
|
||||||
. . 1001: instruction two ;file1000.src:1
|
. . 1001: instruction two
|
||||||
. . 1002: instruction three ;file1000.src:2
|
. . 1002: instruction three
|
||||||
. . 1003: instruction four ;file1000.src:1
|
. . 1003: instruction four
|
||||||
ROUTINE ======================== line3000
|
ROUTINE ======================== line3000
|
||||||
10ms 1.12s (flat, cum) 100% of Total
|
10ms 1.12s (flat, cum) 100% of Total
|
||||||
10ms 1.01s 3000: instruction one ;line3000 file3000.src:6
|
10ms 1.01s 3000: instruction one ;line3000 file3000.src:6
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Pprof listing</title>
|
<title>Pprof listing</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
body {
|
body {
|
||||||
@ -71,17 +70,15 @@ Duration: 10s, Total samples = 1.12s (11.20%)<br>Total: 1.12s</div><h1>line1000<
|
|||||||
<pre onClick="pprof_toggle_asm(event)">
|
<pre onClick="pprof_toggle_asm(event)">
|
||||||
Total: 1.10s 1.10s (flat, cum) 98.21%
|
Total: 1.10s 1.10s (flat, cum) 98.21%
|
||||||
<span class=line> 1</span> <span class=deadsrc> 1.10s 1.10s line1 </span><span class=asm> 1.10s 1.10s 1000: instruction one <span class=disasmloc>file1000.src:1</span>
|
<span class=line> 1</span> <span class=deadsrc> 1.10s 1.10s line1 </span><span class=asm> 1.10s 1.10s 1000: instruction one <span class=disasmloc>file1000.src:1</span>
|
||||||
. . 1001: instruction two <span class=disasmloc>file1000.src:1</span>
|
. . 1001: instruction two <span class=disasmloc></span>
|
||||||
⋮
|
. . 1002: instruction three <span class=disasmloc></span>
|
||||||
. . 1003: instruction four <span class=disasmloc>file1000.src:1</span>
|
. . 1003: instruction four <span class=disasmloc></span>
|
||||||
</span>
|
|
||||||
<span class=line> 2</span> <span class=deadsrc> . . line2 </span><span class=asm> . . 1002: instruction three <span class=disasmloc>file1000.src:2</span>
|
|
||||||
</span>
|
</span>
|
||||||
|
<span class=line> 2</span> <span class=nop> . . line2 </span>
|
||||||
<span class=line> 3</span> <span class=nop> . . line3 </span>
|
<span class=line> 3</span> <span class=nop> . . line3 </span>
|
||||||
<span class=line> 4</span> <span class=nop> . . line4 </span>
|
<span class=line> 4</span> <span class=nop> . . line4 </span>
|
||||||
<span class=line> 5</span> <span class=nop> . . line5 </span>
|
<span class=line> 5</span> <span class=nop> . . line5 </span>
|
||||||
<span class=line> 6</span> <span class=nop> . . line6 </span>
|
<span class=line> 6</span> <span class=nop> . . line6 </span>
|
||||||
<span class=line> 7</span> <span class=nop> . . line7 </span>
|
|
||||||
</pre>
|
</pre>
|
||||||
<h1>line3000</h1>testdata/file3000.src
|
<h1>line3000</h1>testdata/file3000.src
|
||||||
<pre onClick="pprof_toggle_asm(event)">
|
<pre onClick="pprof_toggle_asm(event)">
|
||||||
|
@ -1,21 +0,0 @@
|
|||||||
digraph "testbinary" {
|
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
|
||||||
subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.11s, 99.11% of 1.12s total\lDropped 3 nodes (cum <= 0.06s)\l"] }
|
|
||||||
N1 [label="line1000\n1s (89.29%)" fontsize=24 shape=box tooltip="line1000 (1s)" color="#b20500" fillcolor="#edd6d5"]
|
|
||||||
N1_0 [label = "key1:tag1\nkey2:tag1" fontsize=8 shape=box3d tooltip="1s"]
|
|
||||||
N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"]
|
|
||||||
N2 [label="line3000\n0 of 1.12s (100%)" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"]
|
|
||||||
N3 [label="line3001\n0 of 1.11s (99.11%)" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"]
|
|
||||||
N4 [label="line1000\n0.10s (8.93%)" fontsize=14 shape=box tooltip="line1000 (0.10s)" color="#b28b62" fillcolor="#ede8e2"]
|
|
||||||
N4_0 [label = "key1:tag2\nkey3:tag2" fontsize=8 shape=box3d tooltip="0.10s"]
|
|
||||||
N4 -> N4_0 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"]
|
|
||||||
N5 [label="line3002\n0.01s (0.89%)\nof 1.01s (90.18%)" fontsize=10 shape=box tooltip="line3002 (1.01s)" color="#b20500" fillcolor="#edd6d5"]
|
|
||||||
N6 [label="line2000\n0 of 1s (89.29%)" fontsize=8 shape=box tooltip="line2000 (1s)" color="#b20500" fillcolor="#edd6d5"]
|
|
||||||
N7 [label="line2001\n0 of 1s (89.29%)" fontsize=8 shape=box tooltip="line2001 (1s)" color="#b20500" fillcolor="#edd6d5"]
|
|
||||||
N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"]
|
|
||||||
N3 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"]
|
|
||||||
N6 -> N7 [label=" 1s\n (inline)" weight=90 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1s)" labeltooltip="line2000 -> line2001 (1s)"]
|
|
||||||
N7 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"]
|
|
||||||
N5 -> N6 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1s)" labeltooltip="line3002 -> line2000 (1s)"]
|
|
||||||
N3 -> N4 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"]
|
|
||||||
}
|
|
@ -1,20 +1,20 @@
|
|||||||
digraph "testbinary" {
|
digraph "testbinary" {
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
node [style=filled fillcolor="#f8f8f8"]
|
||||||
subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.12s, 100% of 1.12s total\l"] }
|
subgraph cluster_L { "File: testbinary" [shape=box fontsize=16 label="File: testbinary\lType: cpu\lDuration: 10s, Total samples = 1.12s (11.20%)\lShowing nodes accounting for 1.12s, 100% of 1.12s total\l"] }
|
||||||
N1 [label="line1000\n1.10s (98.21%)" fontsize=24 shape=box tooltip="line1000 (1.10s)" color="#b20000" fillcolor="#edd5d5"]
|
N1 [label="line1000\nfile1000.src\n1.10s (98.21%)" fontsize=24 shape=box tooltip="line1000 testdata/file1000.src (1.10s)" color="#b20000" fillcolor="#edd5d5"]
|
||||||
N1_0 [label = "key1:tag1\nkey2:tag1" fontsize=8 shape=box3d tooltip="1s"]
|
N1_0 [label = "key1:tag1\nkey2:tag1" fontsize=8 shape=box3d tooltip="1s"]
|
||||||
N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"]
|
N1 -> N1_0 [label=" 1s" weight=100 tooltip="1s" labeltooltip="1s"]
|
||||||
N1_1 [label = "key1:tag2\nkey3:tag2" fontsize=8 shape=box3d tooltip="0.10s"]
|
N1_1 [label = "key1:tag2\nkey3:tag2" fontsize=8 shape=box3d tooltip="0.10s"]
|
||||||
N1 -> N1_1 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"]
|
N1 -> N1_1 [label=" 0.10s" weight=100 tooltip="0.10s" labeltooltip="0.10s"]
|
||||||
N2 [label="line3000\n0 of 1.12s (100%)" fontsize=8 shape=box tooltip="line3000 (1.12s)" color="#b20000" fillcolor="#edd5d5"]
|
N2 [label="line3000\nfile3000.src\n0 of 1.12s (100%)" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src (1.12s)" color="#b20000" fillcolor="#edd5d5"]
|
||||||
N3 [label="line3001\n0 of 1.11s (99.11%)" fontsize=8 shape=box tooltip="line3001 (1.11s)" color="#b20000" fillcolor="#edd5d5"]
|
N3 [label="line3001\nfile3000.src\n0 of 1.11s (99.11%)" fontsize=8 shape=box tooltip="line3001 testdata/file3000.src (1.11s)" color="#b20000" fillcolor="#edd5d5"]
|
||||||
N4 [label="line3002\n0.01s (0.89%)\nof 1.02s (91.07%)" fontsize=10 shape=box tooltip="line3002 (1.02s)" color="#b20400" fillcolor="#edd6d5"]
|
N4 [label="line3002\nfile3000.src\n0.01s (0.89%)\nof 1.02s (91.07%)" fontsize=10 shape=box tooltip="line3002 testdata/file3000.src (1.02s)" color="#b20400" fillcolor="#edd6d5"]
|
||||||
N5 [label="line2001\n0.01s (0.89%)\nof 1.01s (90.18%)" fontsize=10 shape=box tooltip="line2001 (1.01s)" color="#b20500" fillcolor="#edd6d5"]
|
N5 [label="line2001\nfile2000.src\n0.01s (0.89%)\nof 1.01s (90.18%)" fontsize=10 shape=box tooltip="line2001 testdata/file2000.src (1.01s)" color="#b20500" fillcolor="#edd6d5"]
|
||||||
N6 [label="line2000\n0 of 1.01s (90.18%)" fontsize=8 shape=box tooltip="line2000 (1.01s)" color="#b20500" fillcolor="#edd6d5"]
|
N6 [label="line2000\nfile2000.src\n0 of 1.01s (90.18%)" fontsize=8 shape=box tooltip="line2000 testdata/file2000.src (1.01s)" color="#b20500" fillcolor="#edd6d5"]
|
||||||
N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 -> line3001 (1.11s)" labeltooltip="line3000 -> line3001 (1.11s)"]
|
N2 -> N3 [label=" 1.11s\n (inline)" weight=100 penwidth=5 color="#b20000" tooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (1.11s)" labeltooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (1.11s)"]
|
||||||
N6 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line2000 -> line2001 (1.01s)" labeltooltip="line2000 -> line2001 (1.01s)"]
|
N6 -> N5 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (1.01s)" labeltooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (1.01s)"]
|
||||||
N3 -> N4 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 -> line3002 (1.01s)" labeltooltip="line3001 -> line3002 (1.01s)"]
|
N3 -> N4 [label=" 1.01s\n (inline)" weight=91 penwidth=5 color="#b20500" tooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (1.01s)" labeltooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (1.01s)"]
|
||||||
N4 -> N6 [label=" 1.01s" weight=91 penwidth=5 color="#b20500" tooltip="line3002 -> line2000 (1.01s)" labeltooltip="line3002 -> line2000 (1.01s)"]
|
N4 -> N6 [label=" 1.01s" weight=91 penwidth=5 color="#b20500" tooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (1.01s)" labeltooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (1.01s)"]
|
||||||
N5 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 -> line1000 (1s)" labeltooltip="line2001 -> line1000 (1s)"]
|
N5 -> N1 [label=" 1s" weight=90 penwidth=5 color="#b20500" tooltip="line2001 testdata/file2000.src -> line1000 testdata/file1000.src (1s)" labeltooltip="line2001 testdata/file2000.src -> line1000 testdata/file1000.src (1s)"]
|
||||||
N3 -> N1 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 -> line1000 (0.10s)" labeltooltip="line3001 -> line1000 (0.10s)"]
|
N3 -> N1 [label=" 0.10s" weight=9 color="#b28b62" tooltip="line3001 testdata/file3000.src -> line1000 testdata/file1000.src (0.10s)" labeltooltip="line3001 testdata/file3000.src -> line1000 testdata/file1000.src (0.10s)"]
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Showing nodes accounting for 1.12s, 100% of 1.12s total
|
Showing nodes accounting for 1.12s, 100% of 1.12s total
|
||||||
flat flat% sum% cum cum%
|
flat flat% sum% cum cum%
|
||||||
1.10s 98.21% 98.21% 1.10s 98.21% line1000
|
1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src
|
||||||
0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline)
|
0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src (inline)
|
||||||
0.01s 0.89% 100% 1.02s 91.07% line3002 (inline)
|
0.01s 0.89% 100% 1.02s 91.07% line3002 testdata/file3000.src (inline)
|
||||||
0 0% 100% 1.01s 90.18% line2000
|
0 0% 100% 1.01s 90.18% line2000 testdata/file2000.src
|
||||||
0 0% 100% 1.12s 100% line3000
|
0 0% 100% 1.12s 100% line3000 testdata/file3000.src
|
||||||
0 0% 100% 1.11s 99.11% line3001 (inline)
|
0 0% 100% 1.11s 99.11% line3001 testdata/file3000.src (inline)
|
||||||
|
14
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek
generated
vendored
14
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.peek
generated
vendored
@ -2,12 +2,12 @@ Showing nodes accounting for 1.12s, 100% of 1.12s total
|
|||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
flat flat% sum% cum cum% calls calls% + context
|
flat flat% sum% cum cum% calls calls% + context
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
1.01s 100% | line2000 (inline)
|
1.01s 100% | line2000 testdata/file2000.src (inline)
|
||||||
0.01s 0.89% 0.89% 1.01s 90.18% | line2001
|
0.01s 0.89% 0.89% 1.01s 90.18% | line2001 testdata/file2000.src
|
||||||
1s 99.01% | line1000
|
1s 99.01% | line1000 testdata/file1000.src
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
1.11s 100% | line3000 (inline)
|
1.11s 100% | line3000 testdata/file3000.src (inline)
|
||||||
0 0% 0.89% 1.11s 99.11% | line3001
|
0 0% 0.89% 1.11s 99.11% | line3001 testdata/file3000.src
|
||||||
1.01s 90.99% | line3002 (inline)
|
1.01s 90.99% | line3002 testdata/file3000.src (inline)
|
||||||
0.10s 9.01% | line1000
|
0.10s 9.01% | line1000 testdata/file1000.src
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
|
20
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags
generated
vendored
20
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.tags
generated
vendored
@ -1,13 +1,13 @@
|
|||||||
key1: Total 1.1s
|
key1: Total 1120
|
||||||
1.0s (89.29%): tag1
|
1000 (89.29%): tag1
|
||||||
100.0ms ( 8.93%): tag2
|
100 ( 8.93%): tag2
|
||||||
10.0ms ( 0.89%): tag3
|
10 ( 0.89%): tag3
|
||||||
10.0ms ( 0.89%): tag4
|
10 ( 0.89%): tag4
|
||||||
|
|
||||||
key2: Total 1.0s
|
key2: Total 1020
|
||||||
1.0s (99.02%): tag1
|
1010 (99.02%): tag1
|
||||||
10.0ms ( 0.98%): tag2
|
10 ( 0.98%): tag2
|
||||||
|
|
||||||
key3: Total 100.0ms
|
key3: Total 100
|
||||||
100.0ms ( 100%): tag2
|
100 ( 100%): tag2
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
key1: Total 100.0ms
|
key1: Total 100
|
||||||
100.0ms ( 100%): tag2
|
100 ( 100%): tag2
|
||||||
|
|
||||||
key3: Total 100.0ms
|
key3: Total 100
|
||||||
100.0ms ( 100%): tag2
|
100 ( 100%): tag2
|
||||||
|
|
||||||
|
32
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces
generated
vendored
32
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.cpu.traces
generated
vendored
@ -4,29 +4,29 @@ Duration: 10s, Total samples = 1.12s (11.20%)
|
|||||||
-----------+-------------------------------------------------------
|
-----------+-------------------------------------------------------
|
||||||
key1: tag1
|
key1: tag1
|
||||||
key2: tag1
|
key2: tag1
|
||||||
1s line1000
|
1s line1000 testdata/file1000.src
|
||||||
line2001
|
line2001 testdata/file2000.src
|
||||||
line2000
|
line2000 testdata/file2000.src
|
||||||
line3002
|
line3002 testdata/file3000.src
|
||||||
line3001
|
line3001 testdata/file3000.src
|
||||||
line3000
|
line3000 testdata/file3000.src
|
||||||
-----------+-------------------------------------------------------
|
-----------+-------------------------------------------------------
|
||||||
key1: tag2
|
key1: tag2
|
||||||
key3: tag2
|
key3: tag2
|
||||||
100ms line1000
|
100ms line1000 testdata/file1000.src
|
||||||
line3001
|
line3001 testdata/file3000.src
|
||||||
line3000
|
line3000 testdata/file3000.src
|
||||||
-----------+-------------------------------------------------------
|
-----------+-------------------------------------------------------
|
||||||
key1: tag3
|
key1: tag3
|
||||||
key2: tag2
|
key2: tag2
|
||||||
10ms line2001
|
10ms line2001 testdata/file2000.src
|
||||||
line2000
|
line2000 testdata/file2000.src
|
||||||
line3002
|
line3002 testdata/file3000.src
|
||||||
line3000
|
line3000 testdata/file3000.src
|
||||||
-----------+-------------------------------------------------------
|
-----------+-------------------------------------------------------
|
||||||
key1: tag4
|
key1: tag4
|
||||||
key2: tag1
|
key2: tag1
|
||||||
10ms line3002
|
10ms line3002 testdata/file3000.src
|
||||||
line3001
|
line3001 testdata/file3000.src
|
||||||
line3000
|
line3000 testdata/file3000.src
|
||||||
-----------+-------------------------------------------------------
|
-----------+-------------------------------------------------------
|
||||||
|
@ -3,17 +3,17 @@ Dropped 2 nodes (cum <= 3.17MB)
|
|||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
flat flat% sum% cum cum% calls calls% + context
|
flat flat% sum% cum cum% calls calls% + context
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
63.48MB 100% | line3002
|
63.48MB 100% | line3002 testdata/file3000.src
|
||||||
0 0% 0% 63.48MB 100% | line2000
|
0 0% 0% 63.48MB 100% | line2000 testdata/file2000.src
|
||||||
63.48MB 100% | line2001 (inline)
|
63.48MB 100% | line2001 testdata/file2000.src (inline)
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
63.48MB 100% | line2000 (inline)
|
63.48MB 100% | line2000 testdata/file2000.src (inline)
|
||||||
62.50MB 98.46% 98.46% 63.48MB 100% | line2001
|
62.50MB 98.46% 98.46% 63.48MB 100% | line2001 testdata/file2000.src
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
0 0% 98.46% 63.48MB 100% | line3000
|
0 0% 98.46% 63.48MB 100% | line3000 testdata/file3000.src
|
||||||
63.48MB 100% | line3002 (inline)
|
63.48MB 100% | line3002 testdata/file3000.src (inline)
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
63.48MB 100% | line3000 (inline)
|
63.48MB 100% | line3000 testdata/file3000.src (inline)
|
||||||
0 0% 98.46% 63.48MB 100% | line3002
|
0 0% 98.46% 63.48MB 100% | line3002 testdata/file3000.src
|
||||||
63.48MB 100% | line2000
|
63.48MB 100% | line2000 testdata/file2000.src
|
||||||
----------------------------------------------------------+-------------
|
----------------------------------------------------------+-------------
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Showing nodes accounting for 150, 100% of 150 total
|
Showing nodes accounting for 150, 100% of 150 total
|
||||||
flat flat% sum% cum cum%
|
flat flat% sum% cum cum%
|
||||||
80 53.33% 53.33% 130 86.67% line3002 (inline)
|
80 53.33% 53.33% 130 86.67% line3002 testdata/file3000.src (inline)
|
||||||
40 26.67% 80.00% 50 33.33% line2001 (inline)
|
40 26.67% 80.00% 50 33.33% line2001 testdata/file2000.src (inline)
|
||||||
30 20.00% 100% 30 20.00% line1000
|
30 20.00% 100% 30 20.00% line1000 testdata/file1000.src
|
||||||
0 0% 100% 50 33.33% line2000
|
0 0% 100% 50 33.33% line2000 testdata/file2000.src
|
||||||
0 0% 100% 150 100% line3000
|
0 0% 100% 150 100% line3000 testdata/file3000.src
|
||||||
0 0% 100% 110 73.33% line3001 (inline)
|
0 0% 100% 110 73.33% line3001 testdata/file3000.src (inline)
|
||||||
|
@ -1,13 +1,13 @@
|
|||||||
digraph "unnamed" {
|
digraph "unnamed" {
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
node [style=filled fillcolor="#f8f8f8"]
|
||||||
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 62.50MB, 63.37% of 98.63MB total\l"] }
|
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 62.50MB, 63.37% of 98.63MB total\l"] }
|
||||||
N1 [label="line2001\n62.50MB (63.37%)" fontsize=24 shape=box tooltip="line2001 (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
N1 [label="line2001\nfile2000.src\n62.50MB (63.37%)" fontsize=24 shape=box tooltip="line2001 testdata/file2000.src (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
NN1_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
NN1_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
||||||
N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
||||||
N2 [label="line3000\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line3000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
N2 [label="line3000\nfile3000.src\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
N3 [label="line2000\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line2000 (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
N3 [label="line2000\nfile2000.src\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line2000 testdata/file2000.src (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
N4 [label="line3002\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line3002 (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
N4 [label="line3002\nfile3000.src\n0 of 62.50MB (63.37%)" fontsize=8 shape=box tooltip="line3002 testdata/file3000.src (62.50MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
N3 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (62.50MB)" labeltooltip="line2000 -> line2001 (62.50MB)"]
|
N3 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (62.50MB)" labeltooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (62.50MB)"]
|
||||||
N2 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"]
|
N2 -> N4 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 testdata/file3000.src -> line3002 testdata/file3000.src (62.50MB)" labeltooltip="line3000 testdata/file3000.src -> line3002 testdata/file3000.src (62.50MB)"]
|
||||||
N4 -> N3 [label=" 62.50MB" weight=64 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (62.50MB)" labeltooltip="line3002 -> line2000 (62.50MB)"]
|
N4 -> N3 [label=" 62.50MB" weight=64 penwidth=4 color="#b21600" tooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (62.50MB)" labeltooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (62.50MB)"]
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
digraph "unnamed" {
|
digraph "unnamed" {
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
node [style=filled fillcolor="#f8f8f8"]
|
||||||
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 36.13MB, 36.63% of 98.63MB total\lDropped 2 nodes (cum <= 4.93MB)\l"] }
|
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: inuse_space\lShowing nodes accounting for 36.13MB, 36.63% of 98.63MB total\lDropped 2 nodes (cum <= 4.93MB)\l"] }
|
||||||
N1 [label="line3002\n31.25MB (31.68%)\nof 32.23MB (32.67%)" fontsize=24 shape=box tooltip="line3002 (32.23MB)" color="#b23200" fillcolor="#eddcd5"]
|
N1 [label="line3002\nfile3000.src\n31.25MB (31.68%)\nof 32.23MB (32.67%)" fontsize=24 shape=box tooltip="line3002 testdata/file3000.src (32.23MB)" color="#b23200" fillcolor="#eddcd5"]
|
||||||
NN1_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
NN1_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
||||||
N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
||||||
N2 [label="line3000\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3000 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
N2 [label="line3000\nfile3000.src\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
||||||
N3 [label="line3001\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
N3 [label="line3001\nfile3000.src\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3001 testdata/file3000.src (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
||||||
N4 [label="line1000\n4.88MB (4.95%)" fontsize=15 shape=box tooltip="line1000 (4.88MB)" color="#b2a086" fillcolor="#edeae7"]
|
N4 [label="line1000\nfile1000.src\n4.88MB (4.95%)" fontsize=15 shape=box tooltip="line1000 testdata/file1000.src (4.88MB)" color="#b2a086" fillcolor="#edeae7"]
|
||||||
NN4_0 [label = "200kB" fontsize=8 shape=box3d tooltip="3.91MB"]
|
NN4_0 [label = "200kB" fontsize=8 shape=box3d tooltip="3.91MB"]
|
||||||
N4 -> NN4_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"]
|
N4 -> NN4_0 [label=" 3.91MB" weight=100 tooltip="3.91MB" labeltooltip="3.91MB"]
|
||||||
N2 -> N3 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"]
|
N2 -> N3 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)" labeltooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)"]
|
||||||
N3 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"]
|
N3 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (32.23MB)" labeltooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (32.23MB)"]
|
||||||
N3 -> N4 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 -> line1000 (3.91MB)" labeltooltip="line3001 -> line1000 (3.91MB)"]
|
N3 -> N4 [label=" 3.91MB" weight=4 color="#b2a58f" tooltip="line3001 testdata/file3000.src -> line1000 testdata/file1000.src (3.91MB)" labeltooltip="line3001 testdata/file3000.src -> line1000 testdata/file1000.src (3.91MB)"]
|
||||||
N1 -> N4 [label=" 0.98MB" color="#b2b0a9" tooltip="line3002 ... line1000 (0.98MB)" labeltooltip="line3002 ... line1000 (0.98MB)" style="dotted" minlen=2]
|
N1 -> N4 [label=" 0.98MB" color="#b2b0a9" tooltip="line3002 testdata/file3000.src ... line1000 testdata/file1000.src (0.98MB)" labeltooltip="line3002 testdata/file3000.src ... line1000 testdata/file1000.src (0.98MB)" style="dotted" minlen=2]
|
||||||
}
|
}
|
||||||
|
10
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags
generated
vendored
10
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
bytes: Total 98.6MB
|
bytes: Total 150
|
||||||
62.5MB (63.37%): 1.56MB
|
80 (53.33%): 400kB
|
||||||
31.2MB (31.68%): 400kB
|
40 (26.67%): 1.56MB
|
||||||
3.9MB ( 3.96%): 200kB
|
20 (13.33%): 200kB
|
||||||
1000.0kB ( 0.99%): 100kB
|
10 ( 6.67%): 100kB
|
||||||
|
|
||||||
|
10
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit
generated
vendored
10
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.heap.tags.unit
generated
vendored
@ -1,6 +1,6 @@
|
|||||||
bytes: Total 103424000.0B
|
bytes: Total 150
|
||||||
65536000.0B (63.37%): 1638400B
|
80 (53.33%): 409600B
|
||||||
32768000.0B (31.68%): 409600B
|
40 (26.67%): 1638400B
|
||||||
4096000.0B ( 3.96%): 204800B
|
20 (13.33%): 204800B
|
||||||
1024000.0B ( 0.99%): 102400B
|
10 ( 6.67%): 102400B
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
Showing nodes accounting for 150, 100% of 150 total
|
Showing nodes accounting for 150, 100% of 150 total
|
||||||
flat flat% sum% cum cum%
|
flat flat% sum% cum cum%
|
||||||
80 53.33% 53.33% 130 86.67% line3002 (inline)
|
80 53.33% 53.33% 130 86.67% line3002 testdata/file3000.src (inline)
|
||||||
40 26.67% 80.00% 50 33.33% line2001 (inline)
|
40 26.67% 80.00% 50 33.33% line2001 testdata/file2000.src (inline)
|
||||||
30 20.00% 100% 30 20.00% line1000
|
30 20.00% 100% 30 20.00% line1000 testdata/file1000.src
|
||||||
0 0% 100% 50 33.33% line2000
|
0 0% 100% 50 33.33% line2000 testdata/file2000.src
|
||||||
0 0% 100% 150 100% line3000
|
0 0% 100% 150 100% line3000 testdata/file3000.src
|
||||||
0 0% 100% 110 73.33% line3001 (inline)
|
0 0% 100% 110 73.33% line3001 testdata/file3000.src (inline)
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
digraph "unnamed" {
|
digraph "unnamed" {
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
node [style=filled fillcolor="#f8f8f8"]
|
||||||
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] }
|
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] }
|
||||||
N1 [label="line3002\n31.25MB (31.68%)\nof 94.73MB (96.04%)" fontsize=20 shape=box tooltip="line3002 (94.73MB)" color="#b20200" fillcolor="#edd5d5"]
|
N1 [label="line3002\nfile3000.src\n31.25MB (31.68%)\nof 94.73MB (96.04%)" fontsize=20 shape=box tooltip="line3002 testdata/file3000.src (94.73MB)" color="#b20200" fillcolor="#edd5d5"]
|
||||||
NN1_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
NN1_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
||||||
N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
N1 -> NN1_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
||||||
N2 [label="line3000\n0 of 98.63MB (100%)" fontsize=8 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"]
|
N2 [label="line3000\nfile3000.src\n0 of 98.63MB (100%)" fontsize=8 shape=box tooltip="line3000 testdata/file3000.src (98.63MB)" color="#b20000" fillcolor="#edd5d5"]
|
||||||
N3 [label="line2001\n62.50MB (63.37%)\nof 63.48MB (64.36%)" fontsize=24 shape=box tooltip="line2001 (63.48MB)" color="#b21600" fillcolor="#edd8d5"]
|
N3 [label="line2001\nfile2000.src\n62.50MB (63.37%)\nof 63.48MB (64.36%)" fontsize=24 shape=box tooltip="line2001 testdata/file2000.src (63.48MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
NN3_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
NN3_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
||||||
N3 -> NN3_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
N3 -> NN3_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
||||||
N4 [label="line2000\n0 of 63.48MB (64.36%)" fontsize=8 shape=box tooltip="line2000 (63.48MB)" color="#b21600" fillcolor="#edd8d5"]
|
N4 [label="line2000\nfile2000.src\n0 of 63.48MB (64.36%)" fontsize=8 shape=box tooltip="line2000 testdata/file2000.src (63.48MB)" color="#b21600" fillcolor="#edd8d5"]
|
||||||
N5 [label="line3001\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
N5 [label="line3001\nfile3000.src\n0 of 36.13MB (36.63%)" fontsize=8 shape=box tooltip="line3001 testdata/file3000.src (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
||||||
N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 -> line2001 (63.48MB)" labeltooltip="line2000 -> line2001 (63.48MB)"]
|
N4 -> N3 [label=" 63.48MB\n (inline)" weight=65 penwidth=4 color="#b21600" tooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (63.48MB)" labeltooltip="line2000 testdata/file2000.src -> line2001 testdata/file2000.src (63.48MB)"]
|
||||||
N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 -> line2000 (63.48MB)" labeltooltip="line3002 -> line2000 (63.48MB)" minlen=2]
|
N1 -> N4 [label=" 63.48MB" weight=65 penwidth=4 color="#b21600" tooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (63.48MB)" labeltooltip="line3002 testdata/file3000.src -> line2000 testdata/file2000.src (63.48MB)" minlen=2]
|
||||||
N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 -> line3002 (62.50MB)" labeltooltip="line3000 -> line3002 (62.50MB)"]
|
N2 -> N1 [label=" 62.50MB\n (inline)" weight=64 penwidth=4 color="#b21600" tooltip="line3000 testdata/file3000.src -> line3002 testdata/file3000.src (62.50MB)" labeltooltip="line3000 testdata/file3000.src -> line3002 testdata/file3000.src (62.50MB)"]
|
||||||
N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)"]
|
N2 -> N5 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)" labeltooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)"]
|
||||||
N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 -> line3002 (32.23MB)" labeltooltip="line3001 -> line3002 (32.23MB)"]
|
N5 -> N1 [label=" 32.23MB\n (inline)" weight=33 penwidth=2 color="#b23200" tooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (32.23MB)" labeltooltip="line3001 testdata/file3000.src -> line3002 testdata/file3000.src (32.23MB)"]
|
||||||
}
|
}
|
||||||
|
@ -1,11 +1,11 @@
|
|||||||
digraph "unnamed" {
|
digraph "unnamed" {
|
||||||
node [style=filled fillcolor="#f8f8f8"]
|
node [style=filled fillcolor="#f8f8f8"]
|
||||||
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] }
|
subgraph cluster_L { "Build ID: buildid" [shape=box fontsize=16 label="Build ID: buildid\lcomment\lType: alloc_space\lShowing nodes accounting for 93.75MB, 95.05% of 98.63MB total\lDropped 1 node (cum <= 4.93MB)\l"] }
|
||||||
N1 [label="line3000\n62.50MB (63.37%)\nof 98.63MB (100%)" fontsize=24 shape=box tooltip="line3000 (98.63MB)" color="#b20000" fillcolor="#edd5d5"]
|
N1 [label="line3000\nfile3000.src\n62.50MB (63.37%)\nof 98.63MB (100%)" fontsize=24 shape=box tooltip="line3000 testdata/file3000.src (98.63MB)" color="#b20000" fillcolor="#edd5d5"]
|
||||||
NN1_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
NN1_0 [label = "1.56MB" fontsize=8 shape=box3d tooltip="62.50MB"]
|
||||||
N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
N1 -> NN1_0 [label=" 62.50MB" weight=100 tooltip="62.50MB" labeltooltip="62.50MB"]
|
||||||
N2 [label="line3001\n31.25MB (31.68%)\nof 36.13MB (36.63%)" fontsize=20 shape=box tooltip="line3001 (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
N2 [label="line3001\nfile3000.src\n31.25MB (31.68%)\nof 36.13MB (36.63%)" fontsize=20 shape=box tooltip="line3001 testdata/file3000.src (36.13MB)" color="#b22e00" fillcolor="#eddbd5"]
|
||||||
NN2_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
NN2_0 [label = "400kB" fontsize=8 shape=box3d tooltip="31.25MB"]
|
||||||
N2 -> NN2_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
N2 -> NN2_0 [label=" 31.25MB" weight=100 tooltip="31.25MB" labeltooltip="31.25MB"]
|
||||||
N1 -> N2 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 -> line3001 (36.13MB)" labeltooltip="line3000 -> line3001 (36.13MB)" minlen=2]
|
N1 -> N2 [label=" 36.13MB\n (inline)" weight=37 penwidth=2 color="#b22e00" tooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)" labeltooltip="line3000 testdata/file3000.src -> line3001 testdata/file3000.src (36.13MB)" minlen=2]
|
||||||
}
|
}
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
Showing nodes accounting for 1.12s, 100% of 1.12s total
|
|
||||||
Showing top 5 nodes out of 6
|
|
||||||
flat flat% sum% cum cum%
|
|
||||||
1.10s 98.21% 98.21% 1.10s 98.21% line1000
|
|
||||||
0.01s 0.89% 99.11% 1.01s 90.18% line2001 (inline)
|
|
||||||
0.01s 0.89% 100% 1.02s 91.07% line3002 (inline)
|
|
||||||
0 0% 100% 1.01s 90.18% line2000
|
|
||||||
0 0% 100% 1.12s 100% line3000
|
|
8
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.text
generated
vendored
Normal file
8
src/cmd/vendor/github.com/google/pprof/internal/driver/testdata/pprof.unknown.flat.functions.text
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
Showing nodes accounting for 1.12s, 100% of 1.12s total
|
||||||
|
flat flat% sum% cum cum%
|
||||||
|
1.10s 98.21% 98.21% 1.10s 98.21% line1000 testdata/file1000.src
|
||||||
|
0.01s 0.89% 99.11% 1.01s 90.18% line2001 testdata/file2000.src (inline)
|
||||||
|
0.01s 0.89% 100% 1.02s 91.07% line3002 testdata/file3000.src (inline)
|
||||||
|
0 0% 100% 1.01s 90.18% line2000 testdata/file2000.src
|
||||||
|
0 0% 100% 1.12s 100% line3000 testdata/file3000.src
|
||||||
|
0 0% 100% 1.11s 99.11% line3001 testdata/file3000.src (inline)
|
27
src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec.go
generated
vendored
27
src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec.go
generated
vendored
@ -131,7 +131,7 @@ func GetBuildID(binary io.ReaderAt) ([]byte, error) {
|
|||||||
if buildID == nil {
|
if buildID == nil {
|
||||||
buildID = note.Desc
|
buildID = note.Desc
|
||||||
} else {
|
} else {
|
||||||
return nil, fmt.Errorf("multiple build ids found, don't know which to use")
|
return nil, fmt.Errorf("multiple build ids found, don't know which to use!")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -240,22 +240,17 @@ func GetBase(fh *elf.FileHeader, loadSegment *elf.ProgHeader, stextOffset *uint6
|
|||||||
}
|
}
|
||||||
return start, nil
|
return start, nil
|
||||||
case elf.ET_DYN:
|
case elf.ET_DYN:
|
||||||
// The process mapping information, start = start of virtual address range,
|
if offset != 0 {
|
||||||
// and offset = offset in the executable file of the start address, tells us
|
if loadSegment == nil || loadSegment.Vaddr == 0 {
|
||||||
// that a runtime virtual address x maps to a file offset
|
return start - offset, nil
|
||||||
// fx = x - start + offset.
|
}
|
||||||
if loadSegment == nil {
|
return 0, fmt.Errorf("Don't know how to handle mapping. Offset=%x, vaddr=%x",
|
||||||
return start - offset, nil
|
offset, loadSegment.Vaddr)
|
||||||
}
|
}
|
||||||
// The program header, if not nil, indicates the offset in the file where
|
if loadSegment == nil {
|
||||||
// the executable segment is located (loadSegment.Off), and the base virtual
|
return start, nil
|
||||||
// address where the first byte of the segment is loaded
|
}
|
||||||
// (loadSegment.Vaddr). A file offset fx maps to a virtual (symbol) address
|
return start - loadSegment.Vaddr, nil
|
||||||
// sx = fx - loadSegment.Off + loadSegment.Vaddr.
|
|
||||||
//
|
|
||||||
// Thus, a runtime virtual address x maps to a symbol address
|
|
||||||
// sx = x - start + offset - loadSegment.Off + loadSegment.Vaddr.
|
|
||||||
return start - offset + loadSegment.Off - loadSegment.Vaddr, nil
|
|
||||||
}
|
}
|
||||||
return 0, fmt.Errorf("Don't know how to handle FileHeader.Type %v", fh.Type)
|
return 0, fmt.Errorf("Don't know how to handle FileHeader.Type %v", fh.Type)
|
||||||
}
|
}
|
||||||
|
3
src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go
generated
vendored
3
src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec_test.go
generated
vendored
@ -62,9 +62,8 @@ func TestGetBase(t *testing.T) {
|
|||||||
{"exec chromeos kernel 4", fhExec, kernelHeader, uint64p(0xffffffff81200198), 0x198, 0x100000, 0, 0x7ee00000, false},
|
{"exec chromeos kernel 4", fhExec, kernelHeader, uint64p(0xffffffff81200198), 0x198, 0x100000, 0, 0x7ee00000, false},
|
||||||
{"exec chromeos kernel unremapped", fhExec, kernelHeader, uint64p(0xffffffff810001c8), 0xffffffff834001c8, 0xffffffffc0000000, 0xffffffff834001c8, 0x2400000, false},
|
{"exec chromeos kernel unremapped", fhExec, kernelHeader, uint64p(0xffffffff810001c8), 0xffffffff834001c8, 0xffffffffc0000000, 0xffffffff834001c8, 0x2400000, false},
|
||||||
{"dyn", fhDyn, nil, nil, 0x200000, 0x300000, 0, 0x200000, false},
|
{"dyn", fhDyn, nil, nil, 0x200000, 0x300000, 0, 0x200000, false},
|
||||||
{"dyn map", fhDyn, lsOffset, nil, 0x0, 0x300000, 0, 0xFFFFFFFFFFE00000, false},
|
{"dyn offset", fhDyn, lsOffset, nil, 0x0, 0x300000, 0, 0xFFFFFFFFFFC00000, false},
|
||||||
{"dyn nomap", fhDyn, nil, nil, 0x0, 0x0, 0, 0, false},
|
{"dyn nomap", fhDyn, nil, nil, 0x0, 0x0, 0, 0, false},
|
||||||
{"dyn map+offset", fhDyn, lsOffset, nil, 0x900000, 0xa00000, 0x200000, 0x500000, false},
|
|
||||||
{"rel", fhRel, nil, nil, 0x2000000, 0x3000000, 0, 0x2000000, false},
|
{"rel", fhRel, nil, nil, 0x2000000, 0x3000000, 0, 0x2000000, false},
|
||||||
{"rel nomap", fhRel, nil, nil, 0x0, ^uint64(0), 0, 0, false},
|
{"rel nomap", fhRel, nil, nil, 0x0, ^uint64(0), 0, 0, false},
|
||||||
{"rel offset", fhRel, nil, nil, 0x100000, 0x200000, 0x1, 0, true},
|
{"rel offset", fhRel, nil, nil, 0x100000, 0x200000, 0x1, 0, true},
|
||||||
|
12
src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph.go
generated
vendored
12
src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph.go
generated
vendored
@ -50,9 +50,7 @@ type DotConfig struct {
|
|||||||
Total int64 // The total weight of the graph, used to compute percentages
|
Total int64 // The total weight of the graph, used to compute percentages
|
||||||
}
|
}
|
||||||
|
|
||||||
const maxNodelets = 4 // Number of nodelets for labels (both numeric and non)
|
// Compose creates and writes a in the DOT format to the writer, using
|
||||||
|
|
||||||
// ComposeDot creates and writes a in the DOT format to the writer, using
|
|
||||||
// the configurations given.
|
// the configurations given.
|
||||||
func ComposeDot(w io.Writer, g *Graph, a *DotAttributes, c *DotConfig) {
|
func ComposeDot(w io.Writer, g *Graph, a *DotAttributes, c *DotConfig) {
|
||||||
builder := &builder{w, a, c}
|
builder := &builder{w, a, c}
|
||||||
@ -206,11 +204,13 @@ func (b *builder) addNode(node *Node, nodeID int, maxFlat float64) {
|
|||||||
|
|
||||||
// addNodelets generates the DOT boxes for the node tags if they exist.
|
// addNodelets generates the DOT boxes for the node tags if they exist.
|
||||||
func (b *builder) addNodelets(node *Node, nodeID int) bool {
|
func (b *builder) addNodelets(node *Node, nodeID int) bool {
|
||||||
|
const maxNodelets = 4 // Number of nodelets for alphanumeric labels
|
||||||
|
const maxNumNodelets = 4 // Number of nodelets for numeric labels
|
||||||
var nodelets string
|
var nodelets string
|
||||||
|
|
||||||
// Populate two Tag slices, one for LabelTags and one for NumericTags.
|
// Populate two Tag slices, one for LabelTags and one for NumericTags.
|
||||||
var ts []*Tag
|
var ts []*Tag
|
||||||
lnts := make(map[string][]*Tag)
|
lnts := make(map[string][]*Tag, 0)
|
||||||
for _, t := range node.LabelTags {
|
for _, t := range node.LabelTags {
|
||||||
ts = append(ts, t)
|
ts = append(ts, t)
|
||||||
}
|
}
|
||||||
@ -242,12 +242,12 @@ func (b *builder) addNodelets(node *Node, nodeID int) bool {
|
|||||||
nodelets += fmt.Sprintf(`N%d_%d [label = "%s" fontsize=8 shape=box3d tooltip="%s"]`+"\n", nodeID, i, t.Name, weight)
|
nodelets += fmt.Sprintf(`N%d_%d [label = "%s" fontsize=8 shape=box3d tooltip="%s"]`+"\n", nodeID, i, t.Name, weight)
|
||||||
nodelets += fmt.Sprintf(`N%d -> N%d_%d [label=" %s" weight=100 tooltip="%s" labeltooltip="%s"]`+"\n", nodeID, nodeID, i, weight, weight, weight)
|
nodelets += fmt.Sprintf(`N%d -> N%d_%d [label=" %s" weight=100 tooltip="%s" labeltooltip="%s"]`+"\n", nodeID, nodeID, i, weight, weight, weight)
|
||||||
if nts := lnts[t.Name]; nts != nil {
|
if nts := lnts[t.Name]; nts != nil {
|
||||||
nodelets += b.numericNodelets(nts, maxNodelets, flatTags, fmt.Sprintf(`N%d_%d`, nodeID, i))
|
nodelets += b.numericNodelets(nts, maxNumNodelets, flatTags, fmt.Sprintf(`N%d_%d`, nodeID, i))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if nts := lnts[""]; nts != nil {
|
if nts := lnts[""]; nts != nil {
|
||||||
nodelets += b.numericNodelets(nts, maxNodelets, flatTags, fmt.Sprintf(`N%d`, nodeID))
|
nodelets += b.numericNodelets(nts, maxNumNodelets, flatTags, fmt.Sprintf(`N%d`, nodeID))
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Fprint(b, nodelets)
|
fmt.Fprint(b, nodelets)
|
||||||
|
61
src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go
generated
vendored
61
src/cmd/vendor/github.com/google/pprof/internal/graph/dotgraph_test.go
generated
vendored
@ -209,59 +209,6 @@ func compareGraphs(t *testing.T, got, want []byte) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestNodeletCountCapping(t *testing.T) {
|
|
||||||
labelTags := make(TagMap)
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
name := fmt.Sprintf("tag-%d", i)
|
|
||||||
labelTags[name] = &Tag{
|
|
||||||
Name: name,
|
|
||||||
Flat: 10,
|
|
||||||
Cum: 10,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
numTags := make(TagMap)
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
name := fmt.Sprintf("num-tag-%d", i)
|
|
||||||
numTags[name] = &Tag{
|
|
||||||
Name: name,
|
|
||||||
Unit: "mb",
|
|
||||||
Value: 16,
|
|
||||||
Flat: 10,
|
|
||||||
Cum: 10,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
node1 := &Node{
|
|
||||||
Info: NodeInfo{Name: "node1-with-tags"},
|
|
||||||
Flat: 10,
|
|
||||||
Cum: 10,
|
|
||||||
NumericTags: map[string]TagMap{"": numTags},
|
|
||||||
LabelTags: labelTags,
|
|
||||||
}
|
|
||||||
node2 := &Node{
|
|
||||||
Info: NodeInfo{Name: "node2"},
|
|
||||||
Flat: 15,
|
|
||||||
Cum: 15,
|
|
||||||
}
|
|
||||||
node3 := &Node{
|
|
||||||
Info: NodeInfo{Name: "node3"},
|
|
||||||
Flat: 15,
|
|
||||||
Cum: 15,
|
|
||||||
}
|
|
||||||
g := &Graph{
|
|
||||||
Nodes: Nodes{
|
|
||||||
node1,
|
|
||||||
node2,
|
|
||||||
node3,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
for n := 1; n <= 3; n++ {
|
|
||||||
input := maxNodelets + n
|
|
||||||
if got, want := len(g.SelectTopNodes(input, true)), n; got != want {
|
|
||||||
t.Errorf("SelectTopNodes(%d): got %d nodes, want %d", input, got, want)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestMultilinePrintableName(t *testing.T) {
|
func TestMultilinePrintableName(t *testing.T) {
|
||||||
ni := &NodeInfo{
|
ni := &NodeInfo{
|
||||||
Name: "test1.test2::test3",
|
Name: "test1.test2::test3",
|
||||||
@ -293,19 +240,19 @@ func TestTagCollapse(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tagWant := [][]*Tag{
|
tagWant := [][]*Tag{
|
||||||
{
|
[]*Tag{
|
||||||
makeTag("1B..2GB", "", 0, 2401, 2401),
|
makeTag("1B..2GB", "", 0, 2401, 2401),
|
||||||
},
|
},
|
||||||
{
|
[]*Tag{
|
||||||
makeTag("2GB", "", 0, 1000, 1000),
|
makeTag("2GB", "", 0, 1000, 1000),
|
||||||
makeTag("1B..12MB", "", 0, 1401, 1401),
|
makeTag("1B..12MB", "", 0, 1401, 1401),
|
||||||
},
|
},
|
||||||
{
|
[]*Tag{
|
||||||
makeTag("2GB", "", 0, 1000, 1000),
|
makeTag("2GB", "", 0, 1000, 1000),
|
||||||
makeTag("12MB", "", 0, 100, 100),
|
makeTag("12MB", "", 0, 100, 100),
|
||||||
makeTag("1B..1MB", "", 0, 1301, 1301),
|
makeTag("1B..1MB", "", 0, 1301, 1301),
|
||||||
},
|
},
|
||||||
{
|
[]*Tag{
|
||||||
makeTag("2GB", "", 0, 1000, 1000),
|
makeTag("2GB", "", 0, 1000, 1000),
|
||||||
makeTag("1MB", "", 0, 1000, 1000),
|
makeTag("1MB", "", 0, 1000, 1000),
|
||||||
makeTag("2B..1kB", "", 0, 201, 201),
|
makeTag("2B..1kB", "", 0, 201, 201),
|
||||||
|
19
src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go
generated
vendored
19
src/cmd/vendor/github.com/google/pprof/internal/graph/graph.go
generated
vendored
@ -240,8 +240,6 @@ type Edge struct {
|
|||||||
Inline bool
|
Inline bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// WeightValue returns the weight value for this edge, normalizing if a
|
|
||||||
// divisor is available.
|
|
||||||
func (e *Edge) WeightValue() int64 {
|
func (e *Edge) WeightValue() int64 {
|
||||||
if e.WeightDiv == 0 {
|
if e.WeightDiv == 0 {
|
||||||
return e.Weight
|
return e.Weight
|
||||||
@ -802,11 +800,7 @@ func (g *Graph) selectTopNodes(maxNodes int, visualMode bool) Nodes {
|
|||||||
// If generating a visual graph, count tags as nodes. Update
|
// If generating a visual graph, count tags as nodes. Update
|
||||||
// maxNodes to account for them.
|
// maxNodes to account for them.
|
||||||
for i, n := range g.Nodes {
|
for i, n := range g.Nodes {
|
||||||
tags := countTags(n)
|
if count += countTags(n) + 1; count >= maxNodes {
|
||||||
if tags > maxNodelets {
|
|
||||||
tags = maxNodelets
|
|
||||||
}
|
|
||||||
if count += tags + 1; count >= maxNodes {
|
|
||||||
maxNodes = i + 1
|
maxNodes = i + 1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -838,6 +832,17 @@ func countTags(n *Node) int {
|
|||||||
return count
|
return count
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// countEdges counts the number of edges below the specified cutoff.
|
||||||
|
func countEdges(el EdgeMap, cutoff int64) int {
|
||||||
|
count := 0
|
||||||
|
for _, e := range el {
|
||||||
|
if e.Weight > cutoff {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
// RemoveRedundantEdges removes residual edges if the destination can
|
// RemoveRedundantEdges removes residual edges if the destination can
|
||||||
// be reached through another path. This is done to simplify the graph
|
// be reached through another path. This is done to simplify the graph
|
||||||
// while preserving connectivity.
|
// while preserving connectivity.
|
||||||
|
20
src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement.go
generated
vendored
20
src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement.go
generated
vendored
@ -170,16 +170,12 @@ func memoryLabel(value int64, fromUnit, toUnit string) (v float64, u string, ok
|
|||||||
|
|
||||||
switch fromUnit {
|
switch fromUnit {
|
||||||
case "byte", "b":
|
case "byte", "b":
|
||||||
case "kb", "kbyte", "kilobyte":
|
case "kilobyte", "kb":
|
||||||
value *= 1024
|
value *= 1024
|
||||||
case "mb", "mbyte", "megabyte":
|
case "megabyte", "mb":
|
||||||
value *= 1024 * 1024
|
value *= 1024 * 1024
|
||||||
case "gb", "gbyte", "gigabyte":
|
case "gigabyte", "gb":
|
||||||
value *= 1024 * 1024 * 1024
|
value *= 1024 * 1024 * 1024
|
||||||
case "tb", "tbyte", "terabyte":
|
|
||||||
value *= 1024 * 1024 * 1024 * 1024
|
|
||||||
case "pb", "pbyte", "petabyte":
|
|
||||||
value *= 1024 * 1024 * 1024 * 1024 * 1024
|
|
||||||
default:
|
default:
|
||||||
return 0, "", false
|
return 0, "", false
|
||||||
}
|
}
|
||||||
@ -192,12 +188,8 @@ func memoryLabel(value int64, fromUnit, toUnit string) (v float64, u string, ok
|
|||||||
toUnit = "kb"
|
toUnit = "kb"
|
||||||
case value < 1024*1024*1024:
|
case value < 1024*1024*1024:
|
||||||
toUnit = "mb"
|
toUnit = "mb"
|
||||||
case value < 1024*1024*1024*1024:
|
|
||||||
toUnit = "gb"
|
|
||||||
case value < 1024*1024*1024*1024*1024:
|
|
||||||
toUnit = "tb"
|
|
||||||
default:
|
default:
|
||||||
toUnit = "pb"
|
toUnit = "gb"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -211,10 +203,6 @@ func memoryLabel(value int64, fromUnit, toUnit string) (v float64, u string, ok
|
|||||||
output, toUnit = float64(value)/(1024*1024), "MB"
|
output, toUnit = float64(value)/(1024*1024), "MB"
|
||||||
case "gb", "gbyte", "gigabyte":
|
case "gb", "gbyte", "gigabyte":
|
||||||
output, toUnit = float64(value)/(1024*1024*1024), "GB"
|
output, toUnit = float64(value)/(1024*1024*1024), "GB"
|
||||||
case "tb", "tbyte", "terabyte":
|
|
||||||
output, toUnit = float64(value)/(1024*1024*1024*1024), "TB"
|
|
||||||
case "pb", "pbyte", "petabyte":
|
|
||||||
output, toUnit = float64(value)/(1024*1024*1024*1024*1024), "PB"
|
|
||||||
}
|
}
|
||||||
return output, toUnit, true
|
return output, toUnit, true
|
||||||
}
|
}
|
||||||
|
43
src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go
generated
vendored
43
src/cmd/vendor/github.com/google/pprof/internal/measurement/measurement_test.go
generated
vendored
@ -1,43 +0,0 @@
|
|||||||
// Copyright 2017 Google Inc. All Rights Reserved.
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package measurement
|
|
||||||
|
|
||||||
import (
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
func TestScale(t *testing.T) {
|
|
||||||
for _, tc := range []struct {
|
|
||||||
value int64
|
|
||||||
fromUnit, toUnit string
|
|
||||||
wantValue float64
|
|
||||||
wantUnit string
|
|
||||||
}{
|
|
||||||
{1, "s", "ms", 1000, "ms"},
|
|
||||||
{1, "kb", "b", 1024, "B"},
|
|
||||||
{1, "kbyte", "b", 1024, "B"},
|
|
||||||
{1, "kilobyte", "b", 1024, "B"},
|
|
||||||
{1, "mb", "kb", 1024, "kB"},
|
|
||||||
{1, "gb", "mb", 1024, "MB"},
|
|
||||||
{1024, "gb", "tb", 1, "TB"},
|
|
||||||
{1024, "tb", "pb", 1, "PB"},
|
|
||||||
{2048, "mb", "auto", 2, "GB"},
|
|
||||||
} {
|
|
||||||
if gotValue, gotUnit := Scale(tc.value, tc.fromUnit, tc.toUnit); gotValue != tc.wantValue || gotUnit != tc.wantUnit {
|
|
||||||
t.Errorf("Scale(%d, %q, %q) = (%f, %q), want (%f, %q)",
|
|
||||||
tc.value, tc.fromUnit, tc.toUnit, gotValue, gotUnit, tc.wantValue, tc.wantUnit)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
16
src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go
generated
vendored
16
src/cmd/vendor/github.com/google/pprof/internal/proftest/proftest.go
generated
vendored
@ -22,7 +22,6 @@ import (
|
|||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"regexp"
|
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -72,11 +71,10 @@ func EncodeJSON(x interface{}) []byte {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TestUI implements the plugin.UI interface, triggering test failures
|
// TestUI implements the plugin.UI interface, triggering test failures
|
||||||
// if more than Ignore errors not matching IgnoreRx are printed.
|
// if more than Ignore errors are printed.
|
||||||
type TestUI struct {
|
type TestUI struct {
|
||||||
T *testing.T
|
T *testing.T
|
||||||
Ignore int
|
Ignore int
|
||||||
IgnoreRx string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadLine returns no input, as no input is expected during testing.
|
// ReadLine returns no input, as no input is expected during testing.
|
||||||
@ -91,14 +89,6 @@ func (ui *TestUI) Print(args ...interface{}) {
|
|||||||
// PrintErr messages may trigger an error failure. A fixed number of
|
// PrintErr messages may trigger an error failure. A fixed number of
|
||||||
// error messages are permitted when appropriate.
|
// error messages are permitted when appropriate.
|
||||||
func (ui *TestUI) PrintErr(args ...interface{}) {
|
func (ui *TestUI) PrintErr(args ...interface{}) {
|
||||||
if ui.IgnoreRx != "" {
|
|
||||||
if matched, err := regexp.MatchString(ui.IgnoreRx, fmt.Sprint(args)); matched || err != nil {
|
|
||||||
if err != nil {
|
|
||||||
ui.T.Errorf("failed to match against regex %q: %v", ui.IgnoreRx, err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ui.Ignore > 0 {
|
if ui.Ignore > 0 {
|
||||||
ui.Ignore--
|
ui.Ignore--
|
||||||
return
|
return
|
||||||
|
49
src/cmd/vendor/github.com/google/pprof/internal/report/report.go
generated
vendored
49
src/cmd/vendor/github.com/google/pprof/internal/report/report.go
generated
vendored
@ -25,7 +25,6 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"text/tabwriter"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/google/pprof/internal/graph"
|
"github.com/google/pprof/internal/graph"
|
||||||
@ -126,9 +125,6 @@ func (rpt *Report) newTrimmedGraph() (g *graph.Graph, origCount, droppedNodes, d
|
|||||||
visualMode := o.OutputFormat == Dot
|
visualMode := o.OutputFormat == Dot
|
||||||
cumSort := o.CumSort
|
cumSort := o.CumSort
|
||||||
|
|
||||||
// The call_tree option is only honored when generating visual representations of the callgraph.
|
|
||||||
callTree := o.CallTree && (o.OutputFormat == Dot || o.OutputFormat == Callgrind)
|
|
||||||
|
|
||||||
// First step: Build complete graph to identify low frequency nodes, based on their cum weight.
|
// First step: Build complete graph to identify low frequency nodes, based on their cum weight.
|
||||||
g = rpt.newGraph(nil)
|
g = rpt.newGraph(nil)
|
||||||
totalValue, _ := g.Nodes.Sum()
|
totalValue, _ := g.Nodes.Sum()
|
||||||
@ -137,7 +133,7 @@ func (rpt *Report) newTrimmedGraph() (g *graph.Graph, origCount, droppedNodes, d
|
|||||||
|
|
||||||
// Filter out nodes with cum value below nodeCutoff.
|
// Filter out nodes with cum value below nodeCutoff.
|
||||||
if nodeCutoff > 0 {
|
if nodeCutoff > 0 {
|
||||||
if callTree {
|
if o.CallTree {
|
||||||
if nodesKept := g.DiscardLowFrequencyNodePtrs(nodeCutoff); len(g.Nodes) != len(nodesKept) {
|
if nodesKept := g.DiscardLowFrequencyNodePtrs(nodeCutoff); len(g.Nodes) != len(nodesKept) {
|
||||||
droppedNodes = len(g.Nodes) - len(nodesKept)
|
droppedNodes = len(g.Nodes) - len(nodesKept)
|
||||||
g.TrimTree(nodesKept)
|
g.TrimTree(nodesKept)
|
||||||
@ -158,7 +154,7 @@ func (rpt *Report) newTrimmedGraph() (g *graph.Graph, origCount, droppedNodes, d
|
|||||||
// Remove low frequency tags and edges as they affect selection.
|
// Remove low frequency tags and edges as they affect selection.
|
||||||
g.TrimLowFrequencyTags(nodeCutoff)
|
g.TrimLowFrequencyTags(nodeCutoff)
|
||||||
g.TrimLowFrequencyEdges(edgeCutoff)
|
g.TrimLowFrequencyEdges(edgeCutoff)
|
||||||
if callTree {
|
if o.CallTree {
|
||||||
if nodesKept := g.SelectTopNodePtrs(nodeCount, visualMode); len(g.Nodes) != len(nodesKept) {
|
if nodesKept := g.SelectTopNodePtrs(nodeCount, visualMode); len(g.Nodes) != len(nodesKept) {
|
||||||
g.TrimTree(nodesKept)
|
g.TrimTree(nodesKept)
|
||||||
g.SortNodes(cumSort, visualMode)
|
g.SortNodes(cumSort, visualMode)
|
||||||
@ -532,7 +528,6 @@ type assemblyInstruction struct {
|
|||||||
line int
|
line int
|
||||||
flat, cum int64
|
flat, cum int64
|
||||||
flatDiv, cumDiv int64
|
flatDiv, cumDiv int64
|
||||||
startsBlock bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *assemblyInstruction) flatValue() int64 {
|
func (a *assemblyInstruction) flatValue() int64 {
|
||||||
@ -622,23 +617,25 @@ func printTags(w io.Writer, rpt *Report) error {
|
|||||||
for _, s := range p.Sample {
|
for _, s := range p.Sample {
|
||||||
for key, vals := range s.Label {
|
for key, vals := range s.Label {
|
||||||
for _, val := range vals {
|
for _, val := range vals {
|
||||||
valueMap, ok := tagMap[key]
|
if valueMap, ok := tagMap[key]; ok {
|
||||||
if !ok {
|
valueMap[val] = valueMap[val] + s.Value[0]
|
||||||
valueMap = make(map[string]int64)
|
continue
|
||||||
tagMap[key] = valueMap
|
|
||||||
}
|
}
|
||||||
valueMap[val] += o.SampleValue(s.Value)
|
valueMap := make(map[string]int64)
|
||||||
|
valueMap[val] = s.Value[0]
|
||||||
|
tagMap[key] = valueMap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for key, vals := range s.NumLabel {
|
for key, vals := range s.NumLabel {
|
||||||
for _, nval := range vals {
|
for _, nval := range vals {
|
||||||
val := formatTag(nval, key)
|
val := formatTag(nval, key)
|
||||||
valueMap, ok := tagMap[key]
|
if valueMap, ok := tagMap[key]; ok {
|
||||||
if !ok {
|
valueMap[val] = valueMap[val] + s.Value[0]
|
||||||
valueMap = make(map[string]int64)
|
continue
|
||||||
tagMap[key] = valueMap
|
|
||||||
}
|
}
|
||||||
valueMap[val] += o.SampleValue(s.Value)
|
valueMap := make(map[string]int64)
|
||||||
|
valueMap[val] = s.Value[0]
|
||||||
|
tagMap[key] = valueMap
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -647,7 +644,6 @@ func printTags(w io.Writer, rpt *Report) error {
|
|||||||
for key := range tagMap {
|
for key := range tagMap {
|
||||||
tagKeys = append(tagKeys, &graph.Tag{Name: key})
|
tagKeys = append(tagKeys, &graph.Tag{Name: key})
|
||||||
}
|
}
|
||||||
tabw := tabwriter.NewWriter(w, 0, 0, 1, ' ', tabwriter.AlignRight)
|
|
||||||
for _, tagKey := range graph.SortTags(tagKeys, true) {
|
for _, tagKey := range graph.SortTags(tagKeys, true) {
|
||||||
var total int64
|
var total int64
|
||||||
key := tagKey.Name
|
key := tagKey.Name
|
||||||
@ -657,19 +653,18 @@ func printTags(w io.Writer, rpt *Report) error {
|
|||||||
tags = append(tags, &graph.Tag{Name: t, Flat: c})
|
tags = append(tags, &graph.Tag{Name: t, Flat: c})
|
||||||
}
|
}
|
||||||
|
|
||||||
f, u := measurement.Scale(total, o.SampleUnit, o.OutputUnit)
|
fmt.Fprintf(w, "%s: Total %d\n", key, total)
|
||||||
fmt.Fprintf(tabw, "%s:\t Total %.1f%s\n", key, f, u)
|
|
||||||
for _, t := range graph.SortTags(tags, true) {
|
for _, t := range graph.SortTags(tags, true) {
|
||||||
f, u := measurement.Scale(t.FlatValue(), o.SampleUnit, o.OutputUnit)
|
|
||||||
if total > 0 {
|
if total > 0 {
|
||||||
fmt.Fprintf(tabw, " \t%.1f%s (%s):\t %s\n", f, u, percentage(t.FlatValue(), total), t.Name)
|
fmt.Fprintf(w, " %8d (%s): %s\n", t.FlatValue(),
|
||||||
|
percentage(t.FlatValue(), total), t.Name)
|
||||||
} else {
|
} else {
|
||||||
fmt.Fprintf(tabw, " \t%.1f%s:\t %s\n", f, u, t.Name)
|
fmt.Fprintf(w, " %8d: %s\n", t.FlatValue(), t.Name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fmt.Fprintln(tabw)
|
fmt.Fprintln(w)
|
||||||
}
|
}
|
||||||
return tabw.Flush()
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// printComments prints all freeform comments in the profile.
|
// printComments prints all freeform comments in the profile.
|
||||||
@ -1060,7 +1055,9 @@ func reportLabels(rpt *Report, g *graph.Graph, origCount, droppedNodes, droppedE
|
|||||||
|
|
||||||
var label []string
|
var label []string
|
||||||
if len(rpt.options.ProfileLabels) > 0 {
|
if len(rpt.options.ProfileLabels) > 0 {
|
||||||
label = append(label, rpt.options.ProfileLabels...)
|
for _, l := range rpt.options.ProfileLabels {
|
||||||
|
label = append(label, l)
|
||||||
|
}
|
||||||
} else if fullHeaders || !rpt.options.CompactLabels {
|
} else if fullHeaders || !rpt.options.CompactLabels {
|
||||||
label = ProfileLabels(rpt)
|
label = ProfileLabels(rpt)
|
||||||
}
|
}
|
||||||
|
20
src/cmd/vendor/github.com/google/pprof/internal/report/source.go
generated
vendored
20
src/cmd/vendor/github.com/google/pprof/internal/report/source.go
generated
vendored
@ -167,7 +167,7 @@ func printWebSource(w io.Writer, rpt *Report, obj plugin.ObjTool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(fileNodes) == 0 {
|
if len(fileNodes) == 0 {
|
||||||
return fmt.Errorf("No source information for %s", o.Symbol.String())
|
return fmt.Errorf("No source information for %s\n", o.Symbol.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
sourceFiles := make(graph.Nodes, 0, len(fileNodes))
|
sourceFiles := make(graph.Nodes, 0, len(fileNodes))
|
||||||
@ -236,18 +236,11 @@ func assemblyPerSourceLine(objSyms []*objSymbol, rs graph.Nodes, src string, obj
|
|||||||
srcBase := filepath.Base(src)
|
srcBase := filepath.Base(src)
|
||||||
anodes := annotateAssembly(insts, rs, o.base)
|
anodes := annotateAssembly(insts, rs, o.base)
|
||||||
var lineno = 0
|
var lineno = 0
|
||||||
var prevline = 0
|
|
||||||
for _, an := range anodes {
|
for _, an := range anodes {
|
||||||
if filepath.Base(an.file) == srcBase {
|
if filepath.Base(an.file) == srcBase {
|
||||||
lineno = an.line
|
lineno = an.line
|
||||||
}
|
}
|
||||||
if lineno != 0 {
|
if lineno != 0 {
|
||||||
if lineno != prevline {
|
|
||||||
// This instruction starts a new block
|
|
||||||
// of contiguous instructions on this line.
|
|
||||||
an.startsBlock = true
|
|
||||||
}
|
|
||||||
prevline = lineno
|
|
||||||
assembly[lineno] = append(assembly[lineno], an)
|
assembly[lineno] = append(assembly[lineno], an)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,12 +306,7 @@ func printFunctionSourceLine(w io.Writer, fn *graph.Node, assembly []assemblyIns
|
|||||||
valueOrDot(fn.Flat, rpt), valueOrDot(fn.Cum, rpt),
|
valueOrDot(fn.Flat, rpt), valueOrDot(fn.Cum, rpt),
|
||||||
template.HTMLEscapeString(fn.Info.Name))
|
template.HTMLEscapeString(fn.Info.Name))
|
||||||
fmt.Fprint(w, "<span class=asm>")
|
fmt.Fprint(w, "<span class=asm>")
|
||||||
for i, an := range assembly {
|
for _, an := range assembly {
|
||||||
if an.startsBlock && i != 0 {
|
|
||||||
// Insert a separator between discontiguous blocks.
|
|
||||||
fmt.Fprintf(w, " %8s %30s\n", "", "⋮")
|
|
||||||
}
|
|
||||||
|
|
||||||
var fileline string
|
var fileline string
|
||||||
class := "disasmloc"
|
class := "disasmloc"
|
||||||
if an.file != "" {
|
if an.file != "" {
|
||||||
@ -334,10 +322,10 @@ func printFunctionSourceLine(w io.Writer, fn *graph.Node, assembly []assemblyIns
|
|||||||
if an.cumDiv != 0 {
|
if an.cumDiv != 0 {
|
||||||
cum = cum / an.cumDiv
|
cum = cum / an.cumDiv
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, " %8s %10s %10s %8x: %s <span class=%s>%s</span>\n", "",
|
fmt.Fprintf(w, " %8s %10s %10s %8x: %-48s <span class=%s>%s</span>\n", "",
|
||||||
valueOrDot(flat, rpt), valueOrDot(cum, rpt),
|
valueOrDot(flat, rpt), valueOrDot(cum, rpt),
|
||||||
an.address,
|
an.address,
|
||||||
template.HTMLEscapeString(fmt.Sprintf("%-48s", strings.Replace(an.instruction, "\t", " ", -1))),
|
template.HTMLEscapeString(an.instruction),
|
||||||
class,
|
class,
|
||||||
template.HTMLEscapeString(fileline))
|
template.HTMLEscapeString(fileline))
|
||||||
}
|
}
|
||||||
|
1
src/cmd/vendor/github.com/google/pprof/internal/report/source_html.go
generated
vendored
1
src/cmd/vendor/github.com/google/pprof/internal/report/source_html.go
generated
vendored
@ -18,7 +18,6 @@ const weblistPageHeader = `
|
|||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
|
||||||
<title>Pprof listing</title>
|
<title>Pprof listing</title>
|
||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
body {
|
body {
|
||||||
|
22
src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer.go
generated
vendored
22
src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer.go
generated
vendored
@ -18,7 +18,6 @@
|
|||||||
package symbolizer
|
package symbolizer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"crypto/tls"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -91,26 +90,7 @@ func (s *Symbolizer) Symbolize(mode string, sources plugin.MappingSources, p *pr
|
|||||||
|
|
||||||
// postURL issues a POST to a URL over HTTP.
|
// postURL issues a POST to a URL over HTTP.
|
||||||
func postURL(source, post string) ([]byte, error) {
|
func postURL(source, post string) ([]byte, error) {
|
||||||
url, err := url.Parse(source)
|
resp, err := http.Post(source, "application/octet-stream", strings.NewReader(post))
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
var tlsConfig *tls.Config
|
|
||||||
if url.Scheme == "https+insecure" {
|
|
||||||
tlsConfig = &tls.Config{
|
|
||||||
InsecureSkipVerify: true,
|
|
||||||
}
|
|
||||||
url.Scheme = "https"
|
|
||||||
source = url.String()
|
|
||||||
}
|
|
||||||
|
|
||||||
client := &http.Client{
|
|
||||||
Transport: &http.Transport{
|
|
||||||
TLSClientConfig: tlsConfig,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
resp, err := client.Post(source, "application/octet-stream", strings.NewReader(post))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("http post %s: %v", source, err)
|
return nil, fmt.Errorf("http post %s: %v", source, err)
|
||||||
}
|
}
|
||||||
|
10
src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go
generated
vendored
10
src/cmd/vendor/github.com/google/pprof/internal/symbolizer/symbolizer_test.go
generated
vendored
@ -207,11 +207,11 @@ func checkSymbolizedLocation(a uint64, got []profile.Line) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var mockAddresses = map[uint64][]plugin.Frame{
|
var mockAddresses = map[uint64][]plugin.Frame{
|
||||||
1000: {frame("fun11", "file11.src", 10)},
|
1000: []plugin.Frame{frame("fun11", "file11.src", 10)},
|
||||||
2000: {frame("fun21", "file21.src", 20), frame("fun22", "file22.src", 20)},
|
2000: []plugin.Frame{frame("fun21", "file21.src", 20), frame("fun22", "file22.src", 20)},
|
||||||
3000: {frame("fun31", "file31.src", 30), frame("fun32", "file32.src", 30), frame("fun33", "file33.src", 30)},
|
3000: []plugin.Frame{frame("fun31", "file31.src", 30), frame("fun32", "file32.src", 30), frame("fun33", "file33.src", 30)},
|
||||||
4000: {frame("fun41", "file41.src", 40), frame("fun42", "file42.src", 40), frame("fun43", "file43.src", 40), frame("fun44", "file44.src", 40)},
|
4000: []plugin.Frame{frame("fun41", "file41.src", 40), frame("fun42", "file42.src", 40), frame("fun43", "file43.src", 40), frame("fun44", "file44.src", 40)},
|
||||||
5000: {frame("fun51", "file51.src", 50), frame("fun52", "file52.src", 50), frame("fun53", "file53.src", 50), frame("fun54", "file54.src", 50), frame("fun55", "file55.src", 50)},
|
5000: []plugin.Frame{frame("fun51", "file51.src", 50), frame("fun52", "file52.src", 50), frame("fun53", "file53.src", 50), frame("fun54", "file54.src", 50), frame("fun55", "file55.src", 50)},
|
||||||
}
|
}
|
||||||
|
|
||||||
func frame(fname, file string, line int) plugin.Frame {
|
func frame(fname, file string, line int) plugin.Frame {
|
||||||
|
2
src/cmd/vendor/github.com/google/pprof/profile/legacy_java_profile.go
generated
vendored
2
src/cmd/vendor/github.com/google/pprof/profile/legacy_java_profile.go
generated
vendored
@ -212,7 +212,7 @@ func parseJavaSamples(pType string, b []byte, p *Profile) ([]byte, map[uint64]*L
|
|||||||
switch pType {
|
switch pType {
|
||||||
case "heap":
|
case "heap":
|
||||||
const javaHeapzSamplingRate = 524288 // 512K
|
const javaHeapzSamplingRate = 524288 // 512K
|
||||||
s.NumLabel = map[string][]int64{"bytes": {s.Value[1] / s.Value[0]}}
|
s.NumLabel = map[string][]int64{"bytes": []int64{s.Value[1] / s.Value[0]}}
|
||||||
s.Value[0], s.Value[1] = scaleHeapSample(s.Value[0], s.Value[1], javaHeapzSamplingRate)
|
s.Value[0], s.Value[1] = scaleHeapSample(s.Value[0], s.Value[1], javaHeapzSamplingRate)
|
||||||
case "contention":
|
case "contention":
|
||||||
if period := p.Period; period != 0 {
|
if period := p.Period; period != 0 {
|
||||||
|
5
src/cmd/vendor/github.com/google/pprof/profile/profile.go
generated
vendored
5
src/cmd/vendor/github.com/google/pprof/profile/profile.go
generated
vendored
@ -596,11 +596,10 @@ func (p *Profile) HasFileLines() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Unsymbolizable returns true if a mapping points to a binary for which
|
// Unsymbolizable returns true if a mapping points to a binary for which
|
||||||
// locations can't be symbolized in principle, at least now. Examples are
|
// locations can't be symbolized in principle, at least now.
|
||||||
// "[vdso]", [vsyscall]" and some others, see the code.
|
|
||||||
func (m *Mapping) Unsymbolizable() bool {
|
func (m *Mapping) Unsymbolizable() bool {
|
||||||
name := filepath.Base(m.File)
|
name := filepath.Base(m.File)
|
||||||
return strings.HasPrefix(name, "[") || strings.HasPrefix(name, "linux-vdso") || strings.HasPrefix(m.File, "/dev/dri/")
|
return name == "[vdso]" || strings.HasPrefix(name, "linux-vdso") || name == "[heap]" || strings.HasPrefix(m.File, "/dev/dri/")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy makes a fully independent copy of a profile.
|
// Copy makes a fully independent copy of a profile.
|
||||||
|
28
src/cmd/vendor/github.com/google/pprof/profile/profile_test.go
generated
vendored
28
src/cmd/vendor/github.com/google/pprof/profile/profile_test.go
generated
vendored
@ -230,40 +230,40 @@ var testProfile = &Profile{
|
|||||||
Location: []*Location{cpuL[0]},
|
Location: []*Location{cpuL[0]},
|
||||||
Value: []int64{1000, 1000},
|
Value: []int64{1000, 1000},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag1"},
|
"key1": []string{"tag1"},
|
||||||
"key2": {"tag1"},
|
"key2": []string{"tag1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*Location{cpuL[1], cpuL[0]},
|
Location: []*Location{cpuL[1], cpuL[0]},
|
||||||
Value: []int64{100, 100},
|
Value: []int64{100, 100},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag2"},
|
"key1": []string{"tag2"},
|
||||||
"key3": {"tag2"},
|
"key3": []string{"tag2"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*Location{cpuL[2], cpuL[0]},
|
Location: []*Location{cpuL[2], cpuL[0]},
|
||||||
Value: []int64{10, 10},
|
Value: []int64{10, 10},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag3"},
|
"key1": []string{"tag3"},
|
||||||
"key2": {"tag2"},
|
"key2": []string{"tag2"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*Location{cpuL[3], cpuL[0]},
|
Location: []*Location{cpuL[3], cpuL[0]},
|
||||||
Value: []int64{10000, 10000},
|
Value: []int64{10000, 10000},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag4"},
|
"key1": []string{"tag4"},
|
||||||
"key2": {"tag1"},
|
"key2": []string{"tag1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
Location: []*Location{cpuL[4], cpuL[0]},
|
Location: []*Location{cpuL[4], cpuL[0]},
|
||||||
Value: []int64{1, 1},
|
Value: []int64{1, 1},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"tag4"},
|
"key1": []string{"tag4"},
|
||||||
"key2": {"tag1"},
|
"key2": []string{"tag1"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -273,10 +273,10 @@ var testProfile = &Profile{
|
|||||||
}
|
}
|
||||||
|
|
||||||
var aggTests = map[string]aggTest{
|
var aggTests = map[string]aggTest{
|
||||||
"precise": {true, true, true, true, 5},
|
"precise": aggTest{true, true, true, true, 5},
|
||||||
"fileline": {false, true, true, true, 4},
|
"fileline": aggTest{false, true, true, true, 4},
|
||||||
"inline_function": {false, true, false, true, 3},
|
"inline_function": aggTest{false, true, false, true, 3},
|
||||||
"function": {false, true, false, false, 2},
|
"function": aggTest{false, true, false, false, 2},
|
||||||
}
|
}
|
||||||
|
|
||||||
type aggTest struct {
|
type aggTest struct {
|
||||||
|
14
src/cmd/vendor/github.com/google/pprof/profile/proto.go
generated
vendored
14
src/cmd/vendor/github.com/google/pprof/profile/proto.go
generated
vendored
@ -71,7 +71,7 @@ func encodeLength(b *buffer, tag int, len int) {
|
|||||||
|
|
||||||
func encodeUint64(b *buffer, tag int, x uint64) {
|
func encodeUint64(b *buffer, tag int, x uint64) {
|
||||||
// append varint to b.data
|
// append varint to b.data
|
||||||
encodeVarint(b, uint64(tag)<<3)
|
encodeVarint(b, uint64(tag)<<3|0)
|
||||||
encodeVarint(b, x)
|
encodeVarint(b, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,6 +145,13 @@ func encodeStrings(b *buffer, tag int, x []string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func encodeStringOpt(b *buffer, tag int, x string) {
|
||||||
|
if x == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
encodeString(b, tag, x)
|
||||||
|
}
|
||||||
|
|
||||||
func encodeBool(b *buffer, tag int, x bool) {
|
func encodeBool(b *buffer, tag int, x bool) {
|
||||||
if x {
|
if x {
|
||||||
encodeUint64(b, tag, 1)
|
encodeUint64(b, tag, 1)
|
||||||
@ -154,9 +161,10 @@ func encodeBool(b *buffer, tag int, x bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func encodeBoolOpt(b *buffer, tag int, x bool) {
|
func encodeBoolOpt(b *buffer, tag int, x bool) {
|
||||||
if x {
|
if x == false {
|
||||||
encodeBool(b, tag, x)
|
return
|
||||||
}
|
}
|
||||||
|
encodeBool(b, tag, x)
|
||||||
}
|
}
|
||||||
|
|
||||||
func encodeMessage(b *buffer, tag int, m message) {
|
func encodeMessage(b *buffer, tag int, m message) {
|
||||||
|
12
src/cmd/vendor/github.com/google/pprof/profile/proto_test.go
generated
vendored
12
src/cmd/vendor/github.com/google/pprof/profile/proto_test.go
generated
vendored
@ -100,8 +100,8 @@ var all = &Profile{
|
|||||||
{
|
{
|
||||||
Location: []*Location{testL[0], testL[1], testL[2], testL[1], testL[1]},
|
Location: []*Location{testL[0], testL[1], testL[2], testL[1], testL[1]},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"value1"},
|
"key1": []string{"value1"},
|
||||||
"key2": {"value2"},
|
"key2": []string{"value2"},
|
||||||
},
|
},
|
||||||
Value: []int64{10, 20},
|
Value: []int64{10, 20},
|
||||||
},
|
},
|
||||||
@ -109,12 +109,12 @@ var all = &Profile{
|
|||||||
Location: []*Location{testL[1], testL[2], testL[0], testL[1]},
|
Location: []*Location{testL[1], testL[2], testL[0], testL[1]},
|
||||||
Value: []int64{30, 40},
|
Value: []int64{30, 40},
|
||||||
Label: map[string][]string{
|
Label: map[string][]string{
|
||||||
"key1": {"value1"},
|
"key1": []string{"value1"},
|
||||||
"key2": {"value2"},
|
"key2": []string{"value2"},
|
||||||
},
|
},
|
||||||
NumLabel: map[string][]int64{
|
NumLabel: map[string][]int64{
|
||||||
"key1": {1, 2},
|
"key1": []int64{1, 2},
|
||||||
"key2": {3, 4},
|
"key2": []int64{3, 4},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
47
src/cmd/vendor/github.com/google/pprof/profile/prune.go
generated
vendored
47
src/cmd/vendor/github.com/google/pprof/profile/prune.go
generated
vendored
@ -22,39 +22,6 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
reservedNames = []string{"(anonymous namespace)", "operator()"}
|
|
||||||
bracketRx = func() *regexp.Regexp {
|
|
||||||
var quotedNames []string
|
|
||||||
for _, name := range append(reservedNames, "(") {
|
|
||||||
quotedNames = append(quotedNames, regexp.QuoteMeta(name))
|
|
||||||
}
|
|
||||||
return regexp.MustCompile(strings.Join(quotedNames, "|"))
|
|
||||||
}()
|
|
||||||
)
|
|
||||||
|
|
||||||
// simplifyFunc does some primitive simplification of function names.
|
|
||||||
func simplifyFunc(f string) string {
|
|
||||||
// Account for leading '.' on the PPC ELF v1 ABI.
|
|
||||||
funcName := strings.TrimPrefix(f, ".")
|
|
||||||
// Account for unsimplified names -- try to remove the argument list by trimming
|
|
||||||
// starting from the first '(', but skipping reserved names that have '('.
|
|
||||||
for _, ind := range bracketRx.FindAllStringSubmatchIndex(funcName, -1) {
|
|
||||||
foundReserved := false
|
|
||||||
for _, res := range reservedNames {
|
|
||||||
if funcName[ind[0]:ind[1]] == res {
|
|
||||||
foundReserved = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !foundReserved {
|
|
||||||
funcName = funcName[:ind[0]]
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return funcName
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prune removes all nodes beneath a node matching dropRx, and not
|
// Prune removes all nodes beneath a node matching dropRx, and not
|
||||||
// matching keepRx. If the root node of a Sample matches, the sample
|
// matching keepRx. If the root node of a Sample matches, the sample
|
||||||
// will have an empty stack.
|
// will have an empty stack.
|
||||||
@ -66,7 +33,12 @@ func (p *Profile) Prune(dropRx, keepRx *regexp.Regexp) {
|
|||||||
var i int
|
var i int
|
||||||
for i = len(loc.Line) - 1; i >= 0; i-- {
|
for i = len(loc.Line) - 1; i >= 0; i-- {
|
||||||
if fn := loc.Line[i].Function; fn != nil && fn.Name != "" {
|
if fn := loc.Line[i].Function; fn != nil && fn.Name != "" {
|
||||||
funcName := simplifyFunc(fn.Name)
|
// Account for leading '.' on the PPC ELF v1 ABI.
|
||||||
|
funcName := strings.TrimPrefix(fn.Name, ".")
|
||||||
|
// Account for unsimplified names -- trim starting from the first '('.
|
||||||
|
if index := strings.Index(funcName, "("); index > 0 {
|
||||||
|
funcName = funcName[:index]
|
||||||
|
}
|
||||||
if dropRx.MatchString(funcName) {
|
if dropRx.MatchString(funcName) {
|
||||||
if keepRx == nil || !keepRx.MatchString(funcName) {
|
if keepRx == nil || !keepRx.MatchString(funcName) {
|
||||||
break
|
break
|
||||||
@ -154,7 +126,12 @@ func (p *Profile) PruneFrom(dropRx *regexp.Regexp) {
|
|||||||
for _, loc := range p.Location {
|
for _, loc := range p.Location {
|
||||||
for i := 0; i < len(loc.Line); i++ {
|
for i := 0; i < len(loc.Line); i++ {
|
||||||
if fn := loc.Line[i].Function; fn != nil && fn.Name != "" {
|
if fn := loc.Line[i].Function; fn != nil && fn.Name != "" {
|
||||||
funcName := simplifyFunc(fn.Name)
|
// Account for leading '.' on the PPC ELF v1 ABI.
|
||||||
|
funcName := strings.TrimPrefix(fn.Name, ".")
|
||||||
|
// Account for unsimplified names -- trim starting from the first '('.
|
||||||
|
if index := strings.Index(funcName, "("); index > 0 {
|
||||||
|
funcName = funcName[:index]
|
||||||
|
}
|
||||||
if dropRx.MatchString(funcName) {
|
if dropRx.MatchString(funcName) {
|
||||||
// Found matching entry to prune.
|
// Found matching entry to prune.
|
||||||
pruneBeneath[loc.ID] = true
|
pruneBeneath[loc.ID] = true
|
||||||
|
91
src/cmd/vendor/github.com/google/pprof/profile/prune_test.go
generated
vendored
91
src/cmd/vendor/github.com/google/pprof/profile/prune_test.go
generated
vendored
@ -25,7 +25,6 @@ func TestPrune(t *testing.T) {
|
|||||||
want string
|
want string
|
||||||
}{
|
}{
|
||||||
{in1, out1},
|
{in1, out1},
|
||||||
{in2, out2},
|
|
||||||
} {
|
} {
|
||||||
in := test.in.Copy()
|
in := test.in.Copy()
|
||||||
in.RemoveUninteresting()
|
in.RemoveUninteresting()
|
||||||
@ -51,10 +50,6 @@ var funs = []*Function{
|
|||||||
{ID: 4, Name: "fun3", SystemName: "fun3", Filename: "fun.c"},
|
{ID: 4, Name: "fun3", SystemName: "fun3", Filename: "fun.c"},
|
||||||
{ID: 5, Name: "fun4", SystemName: "fun4", Filename: "fun.c"},
|
{ID: 5, Name: "fun4", SystemName: "fun4", Filename: "fun.c"},
|
||||||
{ID: 6, Name: "fun5", SystemName: "fun5", Filename: "fun.c"},
|
{ID: 6, Name: "fun5", SystemName: "fun5", Filename: "fun.c"},
|
||||||
{ID: 7, Name: "unsimplified_fun(int)", SystemName: "unsimplified_fun(int)", Filename: "fun.c"},
|
|
||||||
{ID: 8, Name: "Foo::(anonymous namespace)::Test::Bar", SystemName: "Foo::(anonymous namespace)::Test::Bar", Filename: "fun.c"},
|
|
||||||
{ID: 9, Name: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", SystemName: "Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar)", Filename: "fun.c"},
|
|
||||||
{ID: 10, Name: "Foo::operator()(::Bar)", SystemName: "Foo::operator()(::Bar)", Filename: "fun.c"},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var locs1 = []*Location{
|
var locs1 = []*Location{
|
||||||
@ -142,89 +137,3 @@ Locations
|
|||||||
4: 0x0 fun5 fun.c:2 s=0
|
4: 0x0 fun5 fun.c:2 s=0
|
||||||
Mappings
|
Mappings
|
||||||
`
|
`
|
||||||
|
|
||||||
var locs2 = []*Location{
|
|
||||||
{
|
|
||||||
ID: 1,
|
|
||||||
Line: []Line{
|
|
||||||
{Function: funs[0], Line: 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: 2,
|
|
||||||
Line: []Line{
|
|
||||||
{Function: funs[6], Line: 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: 3,
|
|
||||||
Line: []Line{
|
|
||||||
{Function: funs[7], Line: 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: 4,
|
|
||||||
Line: []Line{
|
|
||||||
{Function: funs[8], Line: 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
ID: 5,
|
|
||||||
Line: []Line{
|
|
||||||
{Function: funs[9], Line: 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
var in2 = &Profile{
|
|
||||||
PeriodType: &ValueType{Type: "cpu", Unit: "milliseconds"},
|
|
||||||
Period: 1,
|
|
||||||
DurationNanos: 10e9,
|
|
||||||
SampleType: []*ValueType{
|
|
||||||
{Type: "samples", Unit: "count"},
|
|
||||||
{Type: "cpu", Unit: "milliseconds"},
|
|
||||||
},
|
|
||||||
Sample: []*Sample{
|
|
||||||
// Unsimplified name with parameters shouldn't match.
|
|
||||||
{
|
|
||||||
Location: []*Location{locs2[1], locs2[0]},
|
|
||||||
Value: []int64{1, 1},
|
|
||||||
},
|
|
||||||
// .*Foo::.*::Bar.* should (and will be dropped) regardless of the anonymous namespace.
|
|
||||||
{
|
|
||||||
Location: []*Location{locs2[2], locs2[0]},
|
|
||||||
Value: []int64{1, 1},
|
|
||||||
},
|
|
||||||
// .*Foo::.*::Bar.* shouldn't match inside the parameter list.
|
|
||||||
{
|
|
||||||
Location: []*Location{locs2[3], locs2[0]},
|
|
||||||
Value: []int64{1, 1},
|
|
||||||
},
|
|
||||||
// .*operator\(\) should match, regardless of parameters.
|
|
||||||
{
|
|
||||||
Location: []*Location{locs2[4], locs2[0]},
|
|
||||||
Value: []int64{1, 1},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
Location: locs2,
|
|
||||||
Function: funs,
|
|
||||||
DropFrames: `unsimplified_fun\(int\)|.*Foo::.*::Bar.*|.*operator\(\)`,
|
|
||||||
}
|
|
||||||
|
|
||||||
const out2 = `PeriodType: cpu milliseconds
|
|
||||||
Period: 1
|
|
||||||
Duration: 10s
|
|
||||||
Samples:
|
|
||||||
samples/count cpu/milliseconds
|
|
||||||
1 1: 2 1
|
|
||||||
1 1: 1
|
|
||||||
1 1: 4 1
|
|
||||||
1 1: 1
|
|
||||||
Locations
|
|
||||||
1: 0x0 main main.c:1 s=0
|
|
||||||
2: 0x0 unsimplified_fun(int) fun.c:1 s=0
|
|
||||||
3: 0x0 Foo::(anonymous namespace)::Test::Bar fun.c:1 s=0
|
|
||||||
4: 0x0 Hello::(anonymous namespace)::World(const Foo::(anonymous namespace)::Test::Bar) fun.c:1 s=0
|
|
||||||
5: 0x0 Foo::operator()(::Bar) fun.c:1 s=0
|
|
||||||
Mappings
|
|
||||||
`
|
|
||||||
|
4
src/cmd/vendor/vendor.json
vendored
4
src/cmd/vendor/vendor.json
vendored
@ -9,8 +9,8 @@
|
|||||||
{
|
{
|
||||||
"canonical": "github.com/google/pprof",
|
"canonical": "github.com/google/pprof",
|
||||||
"local": "github.com/google/pprof",
|
"local": "github.com/google/pprof",
|
||||||
"revision": "fffc5831a499a958516664a34cb7ba2b9e228793",
|
"revision": "dec22b42d9eee442222c36c8da24ddc9905e7ee6",
|
||||||
"revisionTime": "2017-05-27T06:02:07Z",
|
"revisionTime": "2017-03-01T19:58:13Z",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"canonical": "golang.org/x/arch/x86/x86asm",
|
"canonical": "golang.org/x/arch/x86/x86asm",
|
||||||
|
Loading…
Reference in New Issue
Block a user