我一直在尝试将 pprof 用于 Linux 上的 Go,但没有获得任何功能信息。我究竟做错了什么?这是我的构建/运行步骤:$ rm -f silly$ go build -gcflags "-N -l" silly.go$ rm -f silly.prof$ ./silly --cpuprofile silly.proffib(42)=267914296t=1.758997214s$ go tool pprof --text silly.prof1.75s of 1.75s total ( 100%) flat flat% sum% cum cum% 1.75s 100% 100% 1.75s 100%我期待 pprof 的输出中有更多细节。“t=1.75...”行表示程序运行耗时 1.75 秒,这似乎是在分析器的 100 Hz 采样率下收集样本的充足时间。这是程序:package mainimport ( "flag" "fmt" "log" "os" "runtime/pprof" "time")func b(n int) int { if n < 2 { return n } else { return a(n-1) + b(n-2) }}func a(n int) int { if n < 2 { return n } else { return a(n-1) + b(n-2) }}var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")func main() { flag.Parse() if *cpuprofile != "" { f, err := os.Create(*cpuprofile) if err != nil { log.Fatal(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } t0 := time.Now() fmt.Printf("fib(42)=%v\n", a(42)) t1 := time.Now() fmt.Printf("t=%v\n", t1.Sub(t0))}我在 Red Hat Enterprise Linux Server 7.0 版上运行,使用 Go 版本 go1.4 linux/amd64。
2 回答
慕婉清6462132
TA贡献1804条经验 获得超2个赞
事实证明,错误是在调用 pprof 工具时省略了二进制名称。正确的调用是:
$ go tool pprof --text silly silly.prof
1750ms of 1750ms total ( 100%)
flat flat% sum% cum cum%
1060ms 60.57% 60.57% 1750ms 100% main.a
690ms 39.43% 100% 1750ms 100% main.b
0 0% 100% 1750ms 100% main.main
0 0% 100% 1750ms 100% runtime.goexit
0 0% 100% 1750ms 100% runtime.main
我的问题中的那行省略了silly,即要分析的二进制文件。
- 2 回答
- 0 关注
- 193 浏览
添加回答
举报
0/150
提交
取消