如何从已构建的Go二进制文件分离调试信息用于dlv调试?
从Go二进制文件分离调试信息的方案
一、用GNU objcopy分离调试信息(推荐)
Go编译器生成的二进制兼容DWARF调试格式,objcopy(GNU binutils组件)可精准分离调试信息,完全适配dlv调试需求:
- 编译完整的非剥离二进制:
go build -o your_app - 提取调试信息到单独文件:
objcopy --only-keep-debug your_app your_app.debug - 剥离原二进制的调试信息(保留符号表):
objcopy --strip-debug your_app - (可选)给二进制添加调试文件关联,让dlv自动识别:
objcopy --add-gnu-debuglink=your_app.debug your_app
如果想要剥离后的二进制大小和go build -ldflags="-s -w"的结果接近,可在剥离调试信息后再移除冗余符号:
objcopy --strip-debug --strip-unneeded your_app
二、用Delve自带工具生成分离文件
Delve提供了专门的转换命令,直接生成适配自身的剥离二进制和调试文件:
dlv convert your_app --output your_app_stripped --debug-out your_app.debug
执行后会得到轻量的your_app_stripped和完整调试信息的your_app.debug,无需额外配置即可用dlv调试。
三、调试操作示例
调试剥离后的二进制时,若未添加自动关联,可手动指定调试文件:
dlv exec ./your_app --debug-file ./your_app.debug
若已添加--add-gnu-debuglink,直接执行dlv exec ./your_app即可,dlv会自动加载对应调试信息。
关于eu-strip的问题说明
eu-strip对Go生成的DWARF信息处理适配性不足,它的剥离逻辑和Go原生的-s -w参数存在差异,因此会出现文件大小不一致的情况,不建议用于Go二进制的调试信息分离。
内容的提问来源于stack exchange,提问作者WeiAnHsieh
相关产品推荐
相关产品推荐

