在windows系统下开发Linux环境下的分布式系统组件时,往往因为组件之间的相互依赖调用需要进行服务端调试,delve是一款开源的go语言调试器,常用的go语言IDE,如goland
vscode
等都是依靠delve
来进行调试操作的.
使用goland远程调试
使用goland
来进行远程调试最好使用goland的 2019.1
版本,原因是在goland 2019.1
之前的版本中,因为调试路径映射的问题,必需保证本地和远程代码目录都在GOPATH
下的src
目录,且文件夹必需同名才可以正常进行远程的断点调试,否则在本地ide开启远程调试后就会显示 error "could not find "
delve的issues里详细的说明了这个问题:https://github.com/go-delve/delve/issues/1163
-
将本地代码拷贝到远程调试机上,可以通过goland插件Remote Hosts Access来完成,也可以手动上传或者
git clone
-
在远程调试机器上安装调试工具
delve
,安装方法 详见作者Github. -
使用
delve
启动调试,这里有2中方式,一种是将代码手动编译成可执行程序调试,一种是直接使用dlv
自动编译启动代码调试.-
手动编译方式调试(使用了
module
特性的推荐使用此方式)编译
# Go 1.10以上版本 go build -gcflags "all=-N -l" cmd/agent/main.go # 使用module离线打包 go build -gcflags "all=-N -l" -o bin/agent -mod=vendor cmd/agent/main.go # Go 1.9及以前 go build -gcflags "-N -l" cmd/agent/main.go
运行
dlv --listen=:2345 --headless=true --api-version=2 exec bin/agent
-
直接debug自动编译运行
dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go
-
-
在本地
goland
添加远程调试配置通过goland的菜单栏Run–>Edit Configurations来添加远程调试的配置
然后选择IDE右上角的远程调试选项,点击小虫子按钮开始远程调试就可以开心的在本地下断点远程调试服务端的程序啦!
tips
-
可以使用docker来降低调试环境复杂度,将
dlv
和go sdk
封装到docker里面,挂载代码工程目录到docker里GOPATH
下的src目录里.拉取调试镜像
docker pull robolwq/golang-debug:1.10.3
挂载本地工程启动docker
# /root/project 为工程目录 # 启动用于调试的容器,并把目标代码目录挂载到容器内 # 特别注意这个参数“--security-opt seccomp:unconfined” # 它的作用是禁用Linux内核层面的Secure computing mode # 目的是为了能够正确使用dlv相关命令 # 具体可以参见:https://docs.docker.com/engine/security/seccomp/ docker container run -ti --rm --security-opt seccomp:unconfined --net=host -v /root/project:/root/go/src/project robolwq/golang-debug:1.10.3 bash > cd $GOPATH/src/project > dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go
-
如果使用
goland 2019.1
以下的版本则需要配置本地目录和远程目录都在环境变量GOPATH
中,且相对路径一致# windows 本地目录 echo %GOPATH% D:\workspace\go # 远程服务器docker 里的环境 echo $GOPATH /root/go # 工程代码必需名称一致且都在各自的GOPATH目录下的src目录里面才可以正常下断点调试 cd /root/go/src/project dlv debug --headless --listen=:2345 --api-version=2 cmd/agent/main.go