场景
通过命令行模式的list命令,为了查看指标消耗在具体哪一行,需要源代码。但实际程序是部署在线上或者程序的源代码目录变了,则pprof从默认路径找不到代码,无法显示是哪一行的问题。
通过浏览器模式的source页面,有时候能知道是哪一行,但没办看到代码
历程
吐槽:百度的答案不多,可能这就是go生态圈现状吧。找到了一个但总是不生效。
解决方案
首先感谢参考地址的作者,源地址:`go tool pprof` - how to specify source when using go modules? - Stack Overflow
主要给出了两个go tool pprof后面添加的参数 -source_path和-trim_path
直接给答案
go tool pprof -source_path=D:\\gop\\youke\\ -trim_path=\\var\\corecdci\\ -inuse_space https://xxx/debug/pprof/heap
分析
-source_path表示源代码的路径:这里要用绝对路径;并且参数值中必须要使用\\,防止\被转义
如果执行命令的位置就是源码所在的路径,可以不指定该参数,我就是在这个路径下
-trim_path表示远程代码路径要截取掉的部分:该参数值中也需要使用\\,防止转义
我的远程路径是这样的:\var\corecdci\app\services\PageModuleMultiService2.go
重点在于截取后的路径前加上source_path指定的路径是本地真正的代码路径,即source_path\截取后剩余的路径,我这里结果就是D:\gop\youke\app\services\PageModuleMultiService2.go,要确保拼接之后是实际存在的文件路径。
Tips:source_path和trim_path如何制定是相对的,只要保证拼接后的文件能找到就可以,比如我可以把source_path设置为D:\\gop\\youke\\app\\,那对应的trim_path就是\\var\\corecdci\\app\\。
最终命令示例:go tool pprof -source_path=源代码所在文件夹路径 -trim_path=远程代码路径要去掉的前缀 -inuse_space https://xxx/debug/pprof/heap