aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2016-06-24 16:59:39 -0700
committerIan Lance Taylor <iant@golang.org>2016-06-25 00:36:40 +0000
commit4fcb4eb27986e5fa7d26aeb85b04909e03d11ff9 (patch)
treec4a36d4f373e9f7a90190fee83e580d9d8748c15 /src
parent83e839f86fcc0762ea513f8d5dd9a50a8338e9c2 (diff)
downloadgo-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.go27
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 {
}