这些问题比较初级,但对于接触go不久的人来说确实挺烦。
对已经编译好的二进制包进行调试,源码路径不对
如果go build的时候加上了-trimpath
参数,在使用dlv调试时,源码路径会变成module而不是真实的文件路径,例如:
没有trimpath参数,正常情况:
> main.main() ./main.go:15 (hits goroutine(1):1 total:1) (PC: 0x4a47d4)
Warning: debugging optimized function
10: ctx := context.Background()
11: t := time.NewTicker(2 * time.Second)
12: for {
13: select {
14: case <-t.C:
=> 15: fmt.Println("Hello world")
16: case <-ctx.Done():
17: return
18: }
19: }
20: }
加上之后:
> main.main() github.com/nchuxyz/experiment/main.go:15 (hits goroutine(1):1 total:1) (PC: 0x4a47d4)
Warning: debugging optimized function
可以看到加上之后源码路径变成了我的module名github.com/nchuxyz/experiment/...
,并且因为找不到源码,调试信息都没显示出来(在vscode中断点会显示为找不到代码)。所以如果module不在gopath里面,且go build时开启了trimpath,就会出现此类问题。(好像pprof分析源码时也会出现相同问题)
dlv自身bug
使用1.8.1版本的dlv调试go1.16编译的二进制包,报错
error layer=debugger can't find build-id note on binary
参考 github issue of go-delve / delve ( @latestas delve@1.8.2of 2022/02/13), 这个问题未能定位, 需要安装其它版本的dlv。
我将dlv1.8.1降到1.7.3版本,没有出现相同的问题。
vscode调试二进制包参考配置
launch.json
"configurations": [
{
"name": "Exec",
"type": "go",
"request": "launch",
"mode": "exec",
"program": "${workspaceFolder}/bin/cdc",
// 以下是程序启动传参
"args": [
"server",
"--pd",
"http://192.168.137.218:2379",
"--data-dir",
"/home/nchuxyz/cdcdata"
]
}
]