go tool pprof使用list命令时源码行丢失如何解决?
问题原因
你遇到的源码行缺失主要由三类原因导致:
- Go编译器默认启用内联、指令重排优化,会裁剪调试信息,打乱源码行号和编译后指令的对应关系
- 内存profile默认仅展示和内存分配/释放操作关联的代码行,无内存操作的行不会被默认展示
- Go 1.16 windows/amd64版本存在调试信息生成的已知bug,会出现行号映射错误
解决步骤
- 第一步:构建测试二进制时禁用编译器优化与内联,保留完整调试信息
执行测试命令时加上-gcflags="all=-N -l"参数,示例如下:
该参数会禁用所有优化和函数内联,保证源码行号和调试信息完全对应。go test -bench . -gcflags="all=-N -l" -benchmem -cpuprofile bench_cpu.pprof -memprofile bench_mem.pprof -memprofilerate 1 - 第二步:区分profile类型,加载对应采样文件查看
仅查看CPU采样关联的代码行,启动pprof时指定CPU profile文件:
仅查看内存采样关联的代码行,启动pprof时指定内存profile文件:go tool pprof .\hw3.test.exe .\bench_cpu.pprofgo tool pprof .\hw3.test.exe .\bench_mem.pprof - 第三步:强制展示函数全量源码行
在pprof交互界面执行list命令时加上-showall参数,即可展示函数全部源码行,无采样数据的行指标会显示为.:(pprof) list -showall SlowSearch - 第四步:修复Go版本bug
Go 1.16 windows/amd64存在调试信息生成的已知问题,建议升级到Go 1.17及以上稳定版本,可直接解决行号映射错误导致的源码缺失问题。
内容的提问来源于stack exchange,提问作者Egor Artemenko
相关产品推荐
相关产品推荐

