]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/vendor/.../pprof: refresh from upstream@a74ae6f
authorHana (Hyang-Ah) Kim <hyangah@gmail.com>
Tue, 20 Mar 2018 20:56:20 +0000 (16:56 -0400)
committerHyang-Ah Hana Kim <hyangah@gmail.com>
Fri, 23 Mar 2018 14:36:29 +0000 (14:36 +0000)
Merges updates listed in
https://github.com/google/pprof/compare/0e0e5b725...a74ae6f

Update #24443

cmd/vendor/vendor.json was updated manually.

Change-Id: I15d5fe82ac18263d4d54f5773cee0e197e93dd59
Reviewed-on: https://go-review.googlesource.com/101736
Reviewed-by: Alberto Donizetti <alb.donizetti@gmail.com>
16 files changed:
src/cmd/vendor/github.com/google/pprof/internal/binutils/addr2liner.go
src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils.go
src/cmd/vendor/github.com/google/pprof/internal/binutils/binutils_test.go
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh [new file with mode: 0755]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 [new file with mode: 0755]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist [new file with mode: 0644]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 [new file with mode: 0644]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64 [new file with mode: 0755]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist [new file with mode: 0644]
src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 [new file with mode: 0644]
src/cmd/vendor/github.com/google/pprof/internal/driver/driver.go
src/cmd/vendor/github.com/google/pprof/internal/driver/fetch.go
src/cmd/vendor/github.com/google/pprof/internal/driver/interactive.go
src/cmd/vendor/github.com/google/pprof/internal/elfexec/elfexec.go
src/cmd/vendor/github.com/google/pprof/third_party/svgpan/svgpan.go
src/cmd/vendor/vendor.json

index 71e471b5d6ace9947aee35959ef07f28176d6906..c0661bf4aa9a3c640f6e3046b41075fffb340096 100644 (file)
@@ -41,9 +41,11 @@ type addr2Liner struct {
        rw   lineReaderWriter
        base uint64
 
-       // nm holds an NM based addr2Liner which can provide
-       // better full names compared to addr2line, which often drops
-       // namespaces etc. from the names it returns.
+       // nm holds an addr2Liner using nm tool. Certain versions of addr2line
+       // produce incomplete names due to
+       // https://sourceware.org/bugzilla/show_bug.cgi?id=17541. As a workaround,
+       // the names from nm are used when they look more complete. See addrInfo()
+       // code below for the exact heuristic.
        nm *addr2LinerNM
 }
 
@@ -215,17 +217,22 @@ func (d *addr2Liner) addrInfo(addr uint64) ([]plugin.Frame, error) {
                return nil, err
        }
 
-       // Get better name from nm if possible.
+       // Certain versions of addr2line produce incomplete names due to
+       // https://sourceware.org/bugzilla/show_bug.cgi?id=17541. Attempt to replace
+       // the name with a better one from nm.
        if len(stack) > 0 && d.nm != nil {
                nm, err := d.nm.addrInfo(addr)
                if err == nil && len(nm) > 0 {
-                       // Last entry in frame list should match since
-                       // it is non-inlined. As a simple heuristic,
-                       // we only switch to the nm-based name if it
-                       // is longer.
+                       // Last entry in frame list should match since it is non-inlined. As a
+                       // simple heuristic, we only switch to the nm-based name if it is longer
+                       // by 2 or more characters. We consider nm names that are longer by 1
+                       // character insignificant to avoid replacing foo with _foo on MacOS (for
+                       // unknown reasons read2line produces the former and nm produces the
+                       // latter on MacOS even though both tools are asked to produce mangled
+                       // names).
                        nmName := nm[len(nm)-1].Func
                        a2lName := stack[len(stack)-1].Func
-                       if len(nmName) > len(a2lName) {
+                       if len(nmName) > len(a2lName)+1 {
                                stack[len(stack)-1].Func = nmName
                        }
                }
index 390f952feb8f73de5ff60c997fcd077f4d15be30..94edd0711aaea2c37e0f0f175ca5d1716da5c726 100644 (file)
@@ -111,6 +111,11 @@ func initTools(b *binrep, config string) {
        defaultPath := paths[""]
        b.llvmSymbolizer, b.llvmSymbolizerFound = findExe("llvm-symbolizer", append(paths["llvm-symbolizer"], defaultPath...))
        b.addr2line, b.addr2lineFound = findExe("addr2line", append(paths["addr2line"], defaultPath...))
+       if !b.addr2lineFound {
+               // On MacOS, brew installs addr2line under gaddr2line name, so search for
+               // that if the tool is not found by its default name.
+               b.addr2line, b.addr2lineFound = findExe("gaddr2line", append(paths["addr2line"], defaultPath...))
+       }
        b.nm, b.nmFound = findExe("nm", append(paths["nm"], defaultPath...))
        b.objdump, b.objdumpFound = findExe("objdump", append(paths["objdump"], defaultPath...))
 }
@@ -306,9 +311,9 @@ func (f *fileNM) SourceLine(addr uint64) ([]plugin.Frame, error) {
 }
 
 // fileAddr2Line implements the binutils.ObjFile interface, using
-// 'addr2line' to map addresses to symbols (with file/line number
-// information). It can be slow for large binaries with debug
-// information.
+// llvm-symbolizer, if that's available, or addr2line to map addresses to
+// symbols (with file/line number information). It can be slow for large
+// binaries with debug information.
 type fileAddr2Line struct {
        once sync.Once
        file
index 0317cf51265942a7aed54854966f833052e2af5c..9f11719694d9cb7b3932cd5d7b91be05938c65ba 100644 (file)
@@ -265,8 +265,6 @@ func TestObjFile(t *testing.T) {
 func TestMachoFiles(t *testing.T) {
        skipUnlessDarwinAmd64(t)
 
-       t.Skip("Disabled because of issues with addr2line (see https://github.com/google/pprof/pull/313#issuecomment-364073010)")
-
        // Load `file`, pretending it was mapped at `start`. Then get the symbol
        // table. Check that it contains the symbol `sym` and that the address
        // `addr` gives the `expected` stack trace.
@@ -291,7 +289,7 @@ func TestMachoFiles(t *testing.T) {
                {"lib normal mapping", "lib_mac_64", 0, math.MaxUint64, 0,
                        0xfa0, "_bar",
                        []plugin.Frame{
-                               {Func: "bar", File: "/tmp/lib.c", Line: 6},
+                               {Func: "bar", File: "/tmp/lib.c", Line: 5},
                        }},
        } {
                t.Run(tc.desc, func(t *testing.T) {
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/build_mac.sh
new file mode 100755 (executable)
index 0000000..5ec98f3
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/bash -x
+
+# This is a script that generates the test MacOS executables in this directory.
+# It should be needed very rarely to run this script. It is mostly provided
+# as a future reference on how the original binary set was created.
+
+set -o errexit
+
+cat <<EOF >/tmp/hello.cc
+#include <stdio.h>
+
+int main() {
+  printf("Hello, world!\n");
+  return 0;
+}
+EOF
+
+cat <<EOF >/tmp/lib.c
+int foo() {
+  return 1;
+}
+
+int bar() {
+  return 2;
+}
+EOF
+
+cd $(dirname $0)
+rm -rf exe_mac_64* lib_mac_64*
+clang -g -o exe_mac_64 /tmp/hello.c
+clang -g -o lib_mac_64 -dynamiclib /tmp/lib.c
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64
new file mode 100755 (executable)
index 0000000..dba1ae1
Binary files /dev/null and b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64 differ
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Info.plist
new file mode 100644 (file)
index 0000000..b6f8ea3
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+       <dict>
+               <key>CFBundleDevelopmentRegion</key>
+               <string>English</string>
+               <key>CFBundleIdentifier</key>
+               <string>com.apple.xcode.dsym.exe_mac_64</string>
+               <key>CFBundleInfoDictionaryVersion</key>
+               <string>6.0</string>
+               <key>CFBundlePackageType</key>
+               <string>dSYM</string>
+               <key>CFBundleSignature</key>
+               <string>????</string>
+               <key>CFBundleShortVersionString</key>
+               <string>1.0</string>
+               <key>CFBundleVersion</key>
+               <string>1</string>
+       </dict>
+</plist>
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64
new file mode 100644 (file)
index 0000000..2cb0e3b
Binary files /dev/null and b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/exe_mac_64.dSYM/Contents/Resources/DWARF/exe_mac_64 differ
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64
new file mode 100755 (executable)
index 0000000..933a3f6
Binary files /dev/null and b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64 differ
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Info.plist
new file mode 100644 (file)
index 0000000..ad5e020
--- /dev/null
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+       <dict>
+               <key>CFBundleDevelopmentRegion</key>
+               <string>English</string>
+               <key>CFBundleIdentifier</key>
+               <string>com.apple.xcode.dsym.lib_mac_64</string>
+               <key>CFBundleInfoDictionaryVersion</key>
+               <string>6.0</string>
+               <key>CFBundlePackageType</key>
+               <string>dSYM</string>
+               <key>CFBundleSignature</key>
+               <string>????</string>
+               <key>CFBundleShortVersionString</key>
+               <string>1.0</string>
+               <key>CFBundleVersion</key>
+               <string>1</string>
+       </dict>
+</plist>
diff --git a/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64
new file mode 100644 (file)
index 0000000..e466c13
Binary files /dev/null and b/src/cmd/vendor/github.com/google/pprof/internal/binutils/testdata/lib_mac_64.dSYM/Contents/Resources/DWARF/lib_mac_64 differ
index c2b1cd082bc56c7c2ce70a65407a03fd353e1be4..f4248fd8c7b83e31686ca2c51d90c07554874ec5 100644 (file)
@@ -138,7 +138,7 @@ func generateReport(p *profile.Profile, cmd []string, vars variables, o *plugin.
 
        // Output to specified file.
        o.UI.PrintErr("Generating report in ", output)
-       out, err := os.Create(output)
+       out, err := o.Writer.Open(output)
        if err != nil {
                return err
        }
index 2b1d90dafdf2e3d6128914773f0e76ae976eb590..ec2745f363e630cc165bb337c670a5658f7520d3 100644 (file)
@@ -534,7 +534,8 @@ func convertPerfData(perfPath string, ui plugin.UI) (*os.File, error) {
                return nil, err
        }
        deferDeleteTempFile(profile.Name())
-       cmd := exec.Command("perf_to_profile", perfPath, profile.Name())
+       cmd := exec.Command("perf_to_profile", "-i", perfPath, "-o", profile.Name(), "-f")
+       cmd.Stdout, cmd.Stderr = os.Stdout, os.Stderr
        if err := cmd.Run(); err != nil {
                profile.Close()
                return nil, fmt.Errorf("failed to convert perf.data file. Try github.com/google/perf_data_converter: %v", err)
index b893697b622c6b61390dfee92e4aa07603251418..bebfbbec1ee1fe937ccb7756dc0e85e8d36ce4bb 100644 (file)
@@ -149,9 +149,14 @@ func greetings(p *profile.Profile, ui plugin.UI) {
        numLabelUnits := identifyNumLabelUnits(p, ui)
        ropt, err := reportOptions(p, numLabelUnits, pprofVariables)
        if err == nil {
-               ui.Print(strings.Join(report.ProfileLabels(report.New(p, ropt)), "\n"))
+               rpt := report.New(p, ropt)
+               ui.Print(strings.Join(report.ProfileLabels(rpt), "\n"))
+               if rpt.Total() == 0 && len(p.SampleType) > 1 {
+                       ui.Print(`No samples were found with the default sample value type.`)
+                       ui.Print(`Try "sample_index" command to analyze different sample values.`, "\n")
+               }
        }
-       ui.Print("Entering interactive mode (type \"help\" for commands, \"o\" for options)")
+       ui.Print(`Entering interactive mode (type "help" for commands, "o" for options)`)
 }
 
 // shortcuts represents composite commands that expand into a sequence
index 7e42c88d145196adc72649100e2cc3b842e853d5..297bb24b1ce0efea09198e8220e134b8efb34e33 100644 (file)
@@ -218,7 +218,7 @@ func GetBase(fh *elf.FileHeader, loadSegment *elf.ProgHeader, stextOffset *uint6
                        // So the base should be:
                        if stextOffset != nil && (start%pageSize) == (*stextOffset%pageSize) {
                                // perf uses the address of _stext as start. Some tools may
-                               // adjust for this before calling GetBase, in which case the the page
+                               // adjust for this before calling GetBase, in which case the page
                                // alignment should be different from that of stextOffset.
                                return start - *stextOffset, nil
                        }
index e7639a388e3314c648b88e556c10f8495029e31a..6ca08adedb943fe51cbed0148af574911aac0065 100644 (file)
@@ -12,7 +12,7 @@ const JSSource = `
  * ======================
  *
  * Given an unique existing element with id "viewport" (or when missing, the
- * first g-element), including the the library into any SVG adds the following
+ * first g-element), including the library into any SVG adds the following
  * capabilities:
  *
  *  - Mouse panning
index 2f75ee7158b13c10ef6d52f9262977c4b348a2ad..1f823fc64808f60227cf2cbb61905dddf4898df1 100644 (file)
@@ -9,8 +9,8 @@
                {
                        "canonical": "github.com/google/pprof",
                        "local": "github.com/google/pprof",
-                       "revision": "9e20b5b106e946f4cd1df94c1f6fe3f88456628d",
-                       "revisionTime": "2017-11-08T17:47:23Z"
+                       "revision": "a74ae6fb3cd7047c79272e3ea0814b08154a2d3c",
+                       "revisionTime": "2018-03-20T17:03:05Z"
                },
                {
                        "canonical": "golang.org/x/arch/x86/x86asm",