Open
Description
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 (e84dfd6)
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
}