dlv调试遇到的一些问题

这些问题比较初级,但对于接触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 [email protected] 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"
            ]
        }
    ]

你可能感兴趣的:(dlv调试遇到的一些问题)