golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
121.36k stars 17.38k forks source link

cmd/pprof: disassembly support for PIE binaries / shared libraries #46639

Open prattmic opened 3 years ago

prattmic commented 3 years ago

go tool pprof does not support disassembly of position independent code (PIE binaries or shared libraries). Notably, on Windows PIE is default, so disassembly doesn't work by default:

gopher@SERVER-2016-V7- c:\workdir>go\bin\go build cpu.go                                                                        

gopher@SERVER-2016-V7- c:\workdir>cpu.exe -output cpu.pprof                                                                      

gopher@SERVER-2016-V7- c:\workdir>pprof.exe -top cpu.exe cpu.pprof                                                               
File: cpu.exe                                                                                                                   
Type: cpu                                                                                                                       
Time: Jun 7, 2021 at 9:19pm (GMT)                                                                                               
Duration: 1.11s, Total samples = 990ms (89.48%)                                                                                  
Showing nodes accounting for 990ms, 100% of 990ms total                                                                         
      flat  flat%   sum%        cum   cum%                                                                                      
     330ms 33.33% 33.33%      840ms 84.85%  time.Since                                                                           
     280ms 28.28% 61.62%      280ms 28.28%  time.Time.Sub                                                                        
     150ms 15.15% 76.77%      990ms   100%  main.main                                                                            
     130ms 13.13% 89.90%      130ms 13.13%  runtime.nanotime1                                                                   
     100ms 10.10%   100%      230ms 23.23%  runtime.nanotime                                                                     
         0     0%   100%      990ms   100%  runtime.main                                                                         

gopher@SERVER-2016-V7- c:\workdir>pprof.exe -disasm . cpu.exe cpu.pprof     
Total: 990ms   

Without PIE:

gopher@SERVER-2016-V7- c:\workdir>go\bin\go build -buildmode=exe cpu.go                                                                        

gopher@SERVER-2016-V7- c:\workdir>cpu.exe -output cpu.pprof                                                                      

gopher@SERVER-2016-V7- c:\workdir>pprof.exe -disasm . cpu.exe cpu.pprof    
Total: 990ms      
ROUTINE ======================== time.Time.Sub                                                                                   
     310ms      310ms (flat, cum) 31.31% of Total                                                                               
...

Upstream pprof's binutils backend supports base address computation to handle position independent code, but our implementation skips that entirely.

The "binutils" implementation doesn't actually seem particularly specific to binutils, so it would likely not be too difficult to support in our implementation.

cc @cherrymui @mknyszek

ianlancetaylor commented 3 years ago

See also #17883.

gopherbot commented 2 years ago

Change https://go.dev/cl/416976 mentions this issue: cmd/pprof: fix addr calculation for Windows

gopherbot commented 1 year ago

Change https://go.dev/cl/227483 mentions this issue: cmd/internal/objfile: read file/line information for ELF PIE binaries