这是一个卡了我两天的报错(痛心),先上解决办法:
解决办法:
go build去掉参数 -ldflags "-w"
goland启动的时候会带上你设置的启动参数(如果你设置了)
背景:
我有两个go项目,项目A go版本 (1.13)什么问题都没有,项目B (go版本1.10)用ide的debug会报错如题:
could not launch process: decoding dwarf section info at offset 0x0: too short
过程:
这种问题没头脑的问题当然先百度了,其中120%(夸张的说法)的答案是:
拉取并安装delve(Goland使用的调试工具)新版本,设置ide的配置
当然不符合我的情况了
我把delve的各个版本装了个遍,go get还经常拉不下来,delve可能还换过地址,网上很多都是老地址,各种花式安装delve
go版本换了n种组合,ide是本月最新的版本
过程种有些delve版本下连项目A也调试不了了,同样的错误(这种应该确实的版本问题)
我试过跳过ide直接指令执行debug,一样
搜完了重重复复重重的中文结果,我爬过了墙头去看隔壁的答案
我在github上的delve和goland的issues的相关问题里一层一层的爬,stackoverflow的评论一条一条的看
问题答案都指向go、delve、goland的版本和组合问题,但是每种方法都不符合我的情况
最后,我看着两个项目(一个可以一个不行),找不同,相同ide,go版本换成同一个,我盯着屏幕思索了良久,难道代码会影响调试工具启动?感觉走到了玄学领域
我把ide编译运行执行debug程序的实际指令 拿出来一个字符一个字符的对比,发现了如上的启动参数的不同,此时心中没有海阔天空,只有mmp
-ldflags "-w"
关于这个指令是干嘛的,我不知道,是在某次mac更新后启动报错时百度告诉我的解决办法,也不知道为什么现在去掉了也没问题
好累
加上上述参数的gobuild指令(去掉了路径种个人信息)
$GOROOT/bin/go build -ldflags -w -o /.../ -gcflags "all=-N -l" xxx
关于这个问题,我在go-delve/delve 的 iss里回复给了一个提问的人,然后一个大佬秒回了我,关键应该在于这个-w参数,下边是原话,垃圾英语水平就不翻译了
大佬给了解释:
The
-w
removes the DWARF debugging information from the binary, so essentially you are trying to debug a binary that's not built to be debugable. Don't add the-w
flag, or strip the binary, when debugging, and Delve will work as expected.