diff options
| author | Ian Lance Taylor <iant@golang.org> | 2016-06-24 16:59:39 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2016-06-25 00:36:40 +0000 |
| commit | 4fcb4eb27986e5fa7d26aeb85b04909e03d11ff9 (patch) | |
| tree | c4a36d4f373e9f7a90190fee83e580d9d8748c15 /src | |
| parent | 83e839f86fcc0762ea513f8d5dd9a50a8338e9c2 (diff) | |
| download | go-4fcb4eb27986e5fa7d26aeb85b04909e03d11ff9.tar.xz | |
cmd/pprof: don't use local symbolization for remote source
If we are using a remote source (a URL), and the user did not specify
the executable file to use, then don't try to use a local source.
This was misbehaving because the local symbolizer will not fail
if there is any memory map available, but the presence of a memory map
does not ensure that the files and symbols are actually available.
We still need a pprof testsuite.
Fixes #16159.
Change-Id: I0250082a4d5181c7babc7eeec6bc95b2f3bcaec9
Reviewed-on: https://go-review.googlesource.com/24464
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/pprof/pprof.go | 27 |
1 files changed, 26 insertions, 1 deletions
diff --git a/src/cmd/pprof/pprof.go b/src/cmd/pprof/pprof.go index feccd1227b..5ee8a112e0 100644 --- a/src/cmd/pprof/pprof.go +++ b/src/cmd/pprof/pprof.go @@ -9,6 +9,7 @@ import ( "debug/gosym" "flag" "fmt" + "net/url" "os" "regexp" "strings" @@ -50,7 +51,16 @@ func symbolize(mode, source string, p *profile.Profile, obj plugin.ObjTool, ui p ui.PrintErr("expecting -symbolize=[local|remote|none][:force]") fallthrough case "", "force": - // Ignore these options, -force is recognized by symbolizer.Symbolize + // -force is recognized by symbolizer.Symbolize. + // If the source is remote, and the mapping file + // does not exist, don't use local symbolization. + if isRemote(source) { + if len(p.Mapping) == 0 { + local = false + } else if _, err := os.Stat(p.Mapping[0].File); err != nil { + local = false + } + } } } @@ -67,6 +77,21 @@ func symbolize(mode, source string, p *profile.Profile, obj plugin.ObjTool, ui p return err } +// isRemote returns whether source is a URL for a remote source. +func isRemote(source string) bool { + url, err := url.Parse(source) + if err != nil { + url, err = url.Parse("http://" + source) + if err != nil { + return false + } + } + if scheme := strings.ToLower(url.Scheme); scheme == "" || scheme == "file" { + return false + } + return true +} + // flags implements the driver.FlagPackage interface using the builtin flag package. type flags struct { } |
