Skip to Content

使用Vs Code 调试 Golang 程序

Vs code 使用 dlv 调试 Golang

Table of Contents

安装 dlv

因为我使用虚拟机开发,Mac 宿主机与 CentOS 虚拟机的 GOPATH 都指向了同一个路径,所以我的 Golang bin 路径是重合的 所以我需要在两个机器上都有一份各自的 dlv,好在 Mac 有 brew,所以 Mac brew 安装的 dlv 就可以避免抢占 GOPATH 路径了。下面记录几个安装中的小问题。

Mac 安装 dlv

brew install 未必会好使,因为 brew 安装是非 root 安装,而 dlv 需要添加系统认证证书,可能会遇到如下安装不成功的报错。

==> Installing delve from go-delve/delve
==> Downloading https://github.com/derekparker/delve/archive/v1.0.0-rc.2.tar.gz
Already downloaded: /Users/idevz/Library/Caches/Homebrew/delve-1.0.0-rc.2.tar.gz
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
==> Generating dlv-cert
==> openssl req -new -newkey rsa:2048 -x509 -days 3650 -nodes -config dlv-cert.cfg -extensions codesign_reqext -batch -out dlv-cert.cer -keyout dlv-cert.key
==> [SUDO] Installing dlv-cert as root
==> sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain dlv-cert.cer
Last 15 lines from /Users/idevz/Library/Logs/Homebrew/delve/02.sudo:
2017-12-11 16:55:26 +0800

sudo
security
add-trusted-cert
-d
-r
trustRoot
-k
/Library/Keychains/System.keychain
dlv-cert.cer


If reporting this issue please do so at (not Homebrew/brew or Homebrew/core):
https://github.com/go-delve/homebrew-delve/issues

These open issues may also help:
Upgrade to delve fails https://github.com/go-delve/homebrew-delve/issues/20
Delve Install on OSX High Sierra 10.13.1 https://github.com/go-delve/homebrew-delve/issues/24

并没有告知具体的错,但是安装并不成功,dlv 不可用。解法很简单,到 delve 源码下载的地址(/Users/idevz/Library/Caches/Homebrew/delve-1.0.0-rc.2.tar.gz), 解压开,并执行里面 scripts 路径下面的 gencert.sh 脚本,再重新 brew install 即可。

cd ~/Library/Caches/Homebrew/delve-1.0.0-rc.2/scripts/
sudo ./gencert.sh
brew install go-delve/delve/delve

注意: brew 安装的 dlv 会在对应的 brew 软件路径下,如:/usr/local/bin/dlv,但是可能你的 GOPATH 会优先于你的 /usr/local/bin/,最好是把 GOPATH 下面的 mv 重命名下。

另外,在 MacOSX 上使用 go get 命令安装 dlv,是不能指定 --backend 参数的。也就不能指定 delve 所使用的后端调试服务,比如 lldbmozilla rr (rr)

CentOS 安装 dlv

CentOS 中,直接使用 go get -u github.com/derekparker/delve/cmd/dlv 安装即可。

Vs code 中配置

本地调试

本地调试实例如下:(仅保留需要关注的配置项)

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "motan-go",
            "type": "go",
            "request": "launch",
            "mode": "debug",
            "program": "/Users/idevz/code/z/git/go/src/github.com/idevz/server/",
            "env": {},
            "args": [],
            "showLog": true
        }
    ]
}
  • mode:指定 debug 的模式,比如还有:test(args:[“-test.run Test Name”]),exec(直接对某个二进制可执行文件进行 debug),remote(远程调试)
  • program:指定要调试的项目,一般可以是可执行的二进制文件,或者包含 main 入口的包或者文件。
  • showLog:远程调试时,在远程服务器显示详细的调试信息。

远程调试

远程调试实例:

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "motan-go",
            "type": "go",
            "request": "launch",
            "mode": "remote",
            "remotePath": "/media/psf/code/z/git/go/src/github.com/idevz/server/",
            "port": 2345,
            "host": "10.211.55.3",
            "program": "/Users/idevz/code/z/git/go/src/github.com/idevz/server/",
            "env": {},
            "args": [],
            "showLog": true
        }
    ]
}
  • host,port:远程调试服务的 ip 和端口信息
  • remotePath:远程调试项目对应的绝对路径
  • 远程调试服务启动:dlv debug --headless --listen=:2345 --log

关于 –backend

目前,CentOS 并不支持这个 flag,如果支持,是不是就可以通过 mozilla/rr 来进行回放了?

微信公众号 / Vanilla-OpenResty