pprof icon indicating copy to clipboard operation
pprof copied to clipboard

Off-by-1 error in Disasm end address

Open cherrymui opened this issue 6 years ago • 3 comments

What version of pprof are you using?

If you are using pprof via go tool pprof, what's your go env output? Go tip (8c10ce164f5b0244f3e08424c13666801b7c5973)

If you run pprof from GitHub, what's the Git revision? tip (e84dfd68c163c45ea47aa24b3dc7eaa93f6675b1)

What operating system and processor architecture are you using?

Linux/AMD64

What did you do?

Disasm is called with a Sym's End as the end address. Sym.End is the virtual address of last byte in sym (Start+size-1) (internal/plugin/plugin.go:176) whereas Disasm is stopping at (before) the end address (internal/plugin/plugin.go:124), i.e. end should be the address after the last instruction. I've seen the last instruction of a function not disassembled correctly, with both binutils and the Go objdump.

The following patch fixes this. Sorry I don't know how to add a test for this.

diff --git a/internal/report/report.go b/internal/report/report.go
index fb67a34..8208f89 100644
--- a/internal/report/report.go
+++ b/internal/report/report.go
@@ -421,7 +421,7 @@ func PrintAssembly(w io.Writer, rpt *Report, obj plugin.ObjTool, maxFuncs int) e
                flatSum, cumSum := sns.Sum()
 
                // Get the function assembly.
-               insts, err := obj.Disasm(s.sym.File, s.sym.Start, s.sym.End)
+               insts, err := obj.Disasm(s.sym.File, s.sym.Start, s.sym.End+1)
                if err != nil {
                        return err
                }
diff --git a/internal/report/source.go b/internal/report/source.go
index ab8b64c..5dbd173 100644
--- a/internal/report/source.go
+++ b/internal/report/source.go
@@ -248,7 +248,7 @@ func assemblyPerSourceLine(objSyms []*objSymbol, rs graph.Nodes, src string, obj
        }
 
        // Extract assembly for matched symbol
-       insts, err := obj.Disasm(o.sym.File, o.sym.Start, o.sym.End)
+       insts, err := obj.Disasm(o.sym.File, o.sym.Start, o.sym.End+1)
        if err != nil {
                return assembly
        }

cherrymui avatar Jan 28 '19 16:01 cherrymui

+kalyanac@ -- I think you'd have the most context for the -disasm output right now.

nolanmar511 avatar Jan 28 '19 17:01 nolanmar511

Thank you for sending the patch. I will test it and report any concerns.

kalyanac avatar Feb 07 '19 06:02 kalyanac

@cherrymui Could you send a PR for this change? Thank you.

aalexand avatar Mar 22 '19 18:03 aalexand