goland不提供一键导出pprof原始.pb.gz文件功能,仅支持可视化展示;获取标准原始数据须手动执行curl或go tool pprof命令,配合程序中正确暴露/debug/pprof端点。

GoLand 里直接导出 pprof 原始数据不现实
GoLand 本身不提供「一键导出 profile.pb.gz」的功能,它没有内置的 pprof 采集器。你看到的「Run with Profiling」选项,底层调用的是 go tool pprof 或集成 runtime/pprof 的临时 profile 文件生成逻辑,但默认只做可视化展示,不保留原始采样文件。
想拿到原始 .pb.gz 文件,得绕过 GoLand UI
真正可控、可复现、可用于离线分析的原始数据,必须由程序自己触发采集或通过 HTTP 端点拉取。GoLand 只能帮你启动服务,不能替你发 curl 或控制 runtime/pprof 的写入路径。
- 如果你用的是
net/http/pprof:在 GoLand 启动服务后,手动执行curl -o cpu.pb.gz 'http://localhost:6060/debug/pprof/profile?seconds=30' - 如果你用的是
runtime/pprof编程式采集:在代码里显式调用pprof.StartCPUProfile或pprof.WriteHeapProfile,并指定*os.File输出到本地路径(如./cpu.prof),GoLand 不会拦截或重定向这个写操作 - 别依赖 GoLand 的「Profiling」弹窗里的「Export」按钮——它导出的是 GoLand 自己解析后的 JSON/SVG,不是标准
profile.proto格式,go tool pprof无法读取
GoLand 配置要点:确保你能访问 /debug/pprof/
很多人在 GoLand 里跑不起来 pprof,根本原因不是配置错,而是端点压根没暴露成功。重点检查这几项:
GoLand 2026.1.1 是 2026.1 发布后的首个维护修正版本,适合已经开始体验 2026.1 新功能并希望同步补丁的开发者。它更适合用于入门项目、现有项目迁移测试和 IDE 行为验证。
-
import _ "net/http/pprof"必须出现在 main 包中,且 HTTP server 使用的是nilmux(即http.ListenAndServe(":6060", nil));若用了 Gin/Echo/自定义http.ServeMux,这行导入完全无效 - GoLand 的 Run Configuration 中,Working directory 要设为项目根目录(否则相对路径写文件可能失败)
- 启动后立刻验证:
curl http://localhost:6060/debug/pprof/必须返回 HTML 列表,而不是 404 或超时;如果失败,GoLand 再怎么配也没用 - 不要勾选「Add content root to classpath」之类 Java 风格选项——GoLand 的 Go 运行配置里没有这个概念,勾了反而可能干扰 GOPATH/GOROOT 解析
最稳的原始数据获取路径:命令行 + GoLand 协同
把 GoLand 当成「可靠的服务启动器」,把数据采集交给终端。这是生产排查的标准做法,也最不容易丢样本。
- 在 GoLand 里配置好 Run → Edit Configurations → Program arguments 和 Environment variables(比如加
GIN_MODE=release避免日志干扰) - 点击绿色三角形启动服务,确认端口监听正常(
lsof -i :6060或netstat -tuln | grep 6060) - 另开终端,执行采集命令:
go tool pprof -output cpu.pb.gz 'http://localhost:6060/debug/pprof/profile?seconds=30'(注意单引号包裹 URL) - 需要比对内存快照?先
curl 'http://localhost:6060/debug/pprof/heap?gc=1' -o heap1.pb.gz,等几秒再抓一次heap2.pb.gz,然后用go tool pprof -base heap1.pb.gz heap2.pb.gz
原始 .pb.gz 文件是否带符号信息,取决于你用的二进制——GoLand 默认 build 的 binary 如果加了 -ldflags="-s -w",火焰图里就只剩地址。这点和你在终端里 go build 完全一致,GoLand 不额外做 strip。










