You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Go Trace定位Go程序中耗时5秒的卡顿函数

Go程序子进程阻塞定位问题解决

问题原因

当你通过exec.Command执行sleep 5时,Go会启动独立子进程,当前线程会进入阻塞等待子进程退出的状态。默认Trace视图仅展示线程整体耗时,不会自动展开阻塞时的栈追踪,所以看不到bar()函数的调用链。

可行的排查方案

方案1:利用Trace的阻塞分析视图

  1. 执行go tool trace trace.out打开可视化界面
  2. 顶部菜单选择Block Profile(阻塞分析)
  3. 找到耗时5秒的阻塞事件,点击即可查看完整栈追踪,包含bar()的调用上下文

方案2:使用pprof阻塞profile

  • 生成阻塞profile文件:curl -o block.out http://localhost:8080/debug/pprof/block?seconds=20
  • 进入pprof交互模式:go tool pprof block.out
  • 输入top查看耗时最高的阻塞点,输入web生成调用图,直接定位到bar()内的exec.Command调用

方案3:Trace的Goroutine分析视图

  1. 在Trace界面选择Goroutine Analysis
  2. 筛选出对应时间段内状态为blocked的Goroutine,点击详情即可查看阻塞时的栈信息,找到bar()的调用链

补充提示

如果你的代码中是通过Run()或Wait()等待子进程,这个等待操作属于线程阻塞,Trace和pprof都能捕获,但必须切换到对应的分析视图,默认概览视图不会展示栈追踪细节。

内容的提问来源于stack exchange,提问作者Gillespie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:52:13