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

AMDuProf分析Golang程序缺失源码仅显示反汇编问题咨询

AMDuProf 解析Go程序符号/源码失败的解决方法

这个问题和你选release/debug构建模式没有直接关系,本质是Go的二进制符号格式、栈结构和AMDuProf默认的C/C++程序解析逻辑不兼容,按以下步骤逐一排查配置即可:

  • 先修正Go编译参数
    Go默认构建(哪怕是debug模式)生成的DWARF调试信息是不完整的,不会生成AMDuProf栈解析依赖的位置列表信息,且很多本地构建脚本会默认加-s/-w链接参数裁掉调试段。不管用什么构建模式,编译时必须加这两个参数:
    go build -gcflags="-dwarflocationlists=true" -ldflags="-s=false -w=false" -o your_app main.go
    编译完成后可以执行file your_app确认输出里包含not stripped标识,再用objdump --dwarf=info your_app | wc -l验证有DWARF段输出,就说明符号信息是完整的。

  • 修正AMDuProf的采样配置,不要只配root/source folder

    1. 新建采样会话时,找到Symbol Search Path配置项,手动把你编译生成的Go二进制所在的绝对路径加进去,AMDuProf不会自动从进程运行目录加载非系统库的符号,这是函数显示为processname<address offset>的核心原因
    2. 在Source Lookup配置页,除了你的项目源码根目录,必须额外把本地GOROOT/src的绝对路径加进去,否则Go runtime相关的函数永远只会显示反汇编
    3. 采样模式不要选默认的EBS(Event-Based Sampling),切换为TBP(Targeted Branch Profiling)或者带完整栈采集的Call Graph模式,Go的用户态栈帧布局和C程序不同,默认EBS模式抓不到完整的调用栈帧,自然无法匹配符号和源码行。
  • 避坑检查
    不要用UPX等加壳/压缩工具处理编译后的Go二进制;如果是在容器内运行程序要attach采样,必须保证容器内的项目源码路径、GOROOT路径和你在AMDuProf里配置的源码搜索路径完全一致,不然路径不匹配永远加载不到源码,更简单的方式是在容器内用AMDuProf命令行工具采集完性能数据,把结果文件拷贝到宿主机用GUI打开分析。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 12:21:28