使用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 所使用的后端调试服务,比如 lldb
,mozilla 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
来进行回放了?