原创分享 GO 语言开发调试高阶

nevermosby · 2020年03月04日 · 1216 次阅读
本帖已被设为精华帖!

上一篇文章主页介绍了 delve 这个神器,这次我们再一次进阶,高阶调试——远程调试。

为什么需要远程调试

最近在二次开发一个分布式系统,几个组件互相依赖。由于本地环境(windows 系统)限制,无法像 Linux 环境那样,快速搭建目标程序所依赖的分布式环境。 而在远端 SIT 环境已经部署好了整套分布式系统,因此想到,是否可以用本地 IDE 上远程调试部署在远端的目标程序?

Luckily,对于 go 程序来说,可以借助 Goland 这款开发利器完成远程调试,VS Code 也可以,但 Goland 提供的界面化配置更直观。

通过 Goland 远程调试

  1. 为本地代码创建远程服务器的部署策略 首先确保 Goland 已经安装了 “Remote Hosts Access” 插件,并且保持启用状态: remote-hosts-access

通过菜单栏 Tools–>Deployment–>Configuration 添加新的部署配置: remotedebug-addconf

点击➕号,创建一个 SFTP 配置,下面是我的配置,目标机器是一台局域网 Ubuntu 机器,在 “Connection” 页面一般需要填入:

  • “Host” 和 “Port”
  • “User name”
  • “Authentication”,是指选择连接远端机器的方式,可以通过密码、私钥或 openssh agent,注意这里的私钥只支持 SSH-2 协议和 ppk 形式

remotedebug-deployment

在 “Mappings” 页面一般只需要填入 “Deployment path”,指定远端机器的部署路径,如果你的 local path 是一个 GOPATH 路径,那么 “Deployment path” 也是一个 GOPATH 路径: addmappingconf

以上完成了创建对远端机器部署的策略,可以通过Tools->Deployment->Upload to ,点击执行部署操作: remotedebug-upload

成功部署后 Goland 会显示相关信息,可以看到 “部署” 的本质就是把本地文件上传到远端服务器上: uploadaddon

查看远端 ubuntu 服务器上已经有同样的 code base: remote-ubuntu-folder

2.远端服务器上以 debug 模式启动程序

根据上一篇中阶文章使用dlv debug命令启动程序,具体步骤如下:

# 启动调试应用部署的docker容器,注意加上 
--security-opt seccomp:unconfined ,--cap-add=SYS_PTRACE 两个高级选项。
前者用来关闭容器访问资源限制,后者是允许容器使用ptrace能力

> docker run -ti --rm --security-opt seccomp:unconfined --cap-add=SYS_PTRACE --net=host -v /home/davidli/gopp:/root/go robolwq/golang-debug:1.10.3 bash

# 进入容器后,运行dlv debug启动程序

> dlv debug --headless --api-version=2 --listen=:80 ./src/github.com/nevermosby/godebug/main.go

这里有几个陌生的 delve 启动参数:

  • --headless: run debug server only, in headless mode,只启动服务端,使用非交互模式
  • --api-version: selects API version when headless. (default 1),如果是 headless 模式,就需要指定一个大于 1 的版本
  • --listen: debugging server listen address. (default "localhost:0"),监听程序启动时使用的端口

命令成功执行后反馈如下: dlvdebug

3.为本地项目添加远程调试策略

在远端服务器通过 dlv debug 启动程序后,剩下就是为本地项目创建远程调试策略,即如何连接远端服务器上应用程序,利器 Goland 为此提供了非常方便的界面操作方式。

通过菜单栏Run–>Edit Configurations添加新的调试配置: adddebugconf

点击➕号,创建一个 Go Remote 配置,在 “Configuration” 页面需要填入 Host,就是远端服务器的可以联通的 IP 地址或机器名;Port,就是刚刚 dlv debug 启动时指定的监听端口,如下图所示。完成后点击 OK 保存。 addgoremote

接下来一步非常重要,为本地项目指定 GOPATH 路径。很多情况下,本地安装 GO SDK 后默认 GOPATH 是安装目录,不是本地项目开发时使用的 GOPATH 路径。通过 Goland 菜单栏 File->Settings,打开项目配置界面,在左边导航栏找到 GOPATH 选项,点击 ➕ 添加 Project GOPATH,指定当前本地项目的 GOPATH,如下图所示: setgopath

Finally,万事俱备,准备开始我们的表演。

  • 点击目标代码行设置断点
  • 在工具栏选择刚刚配置的调试选项(我这里是 remote-ubuntu)
  • 点击右边小虫子按钮(是不是隐喻调试的本质就是为了找出 bug)启动本地调试

start-debug

调试开始后,本地 Goland 会根据 remote-ubuntu 配置的远程服务器和端口,尝试连接 delve 服务,连接成功后会显示 connected: debugconnected

这时,在远端服务器上的程序也输出一条新的日志 “Started!!!”,表明当前 web 服务正式启动,可以接受用户请求了。 appendlog

模拟用户在本地浏览器端或直接 curl 远端程序:

curl http://192.168.56.101/davidli

Bingo,本地 Goland 上设置的断点命中了! hitbp

接下来就跟在本地开发一样,顺滑地开始你的找虫子之旅吧! 再给大家贴一张动图,把上面几个重要步骤串联起来 recap 一把:

summary

博客原文

更多原创文章干货分享,请关注公众号
  • 加微信实战群请加微信(注明:实战群):gocnio
kevin 将本帖设为了精华贴 03月04日 09:50
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册