前言
本文将对远程调试这个日常开发问题,进行一些方法上的梳理,涉及语言包括golang、python。
为什么
为什么需要远程调试?在公司内开发,往往需要依赖到公司的内部组件,例如mysql、redis、es等等,这些数据数据敏感,一般不开放外网甚至办公网的访问权限,因此,我们开发自测阶段,就无法连上组件进行调试。一般公司会提供可访问内网的云开发机,这种情况下,一般的开发模式就有:1. 直接通过终端工具,连接云开发机,使用vim等编辑器开发、自测;2. 通过vscode等客户端,ssh 打开远程开发机上的代码,进行开发、测试。vim 插件工具使用得非常顺手的同学一般会使用方式1,对于不熟练vim的同学,就比痛苦。方式2,本地IDE开发,可以使用IDE提供的各种高级功能,如 rebuild 等功能,比较方便,是大部分开发者首选。但这两种方式,都无法使用 debug 工具定位代码问题。
因此,这里介绍第三种方法:远程调试,在本地和远程开发机都拉取一份代码,编辑本地代码,通过idea的代码同步工具,实时同步两边代码。调试时,启动远程代码,本地通过 Delve 工具连接远程启动进程,对代码进行控制。
最早,远程调试还是使用在排查环境(线上)问题场景中,现在已经普遍用在开发阶段。
是什么
远程调试是在本地运行调试器,通过远程调试接口,进行本地和远程的网络通信,实现本地设置断点控制远程程序,并将结果返回本地的软件技术。
怎么做
不同开发语言的远程调试工具不同,下面举例说明Golang和Python两种开发语言的配置方法。
Golang
下面介绍Goland Delve工具的远程调试方法。
1. 远程服务器安装Delve工具,用于开启远程调试接口。
了解delve参见官网说明,这里只简单介绍安装和使用。
代码语言:txt复制$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv
$ dlv version # 查看是否安装成功
2. 本地Goland添加远程服务器的SSH配置。
File > Settings > Build, Execution, Deployment > Deployment
选择SFTP方式同步,SSH配置主机、用户名、认证方式,免密登录设置自行google。
可通过 Test Connection,测试连通性。
Root Path为远程服务根路径,结合Mappings,对齐本地和远程代码仓库路径。
Tools > Deployment > Automic Upload
至此,已经能实现了本地代码和远程代码的自动同步。
3. 添加远程调试配置
Run > Edit Configurations... > > Go Remote
4. 运行
参照上面配置提示,需要在远程服务器项目目录下,运行如下命令,默认运行当前目录下的main.go程序,也可运行其他,在后面跟上执行命令即可。
代码语言:txt复制dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient xxx
关于dlv命令:
详细可参考:Delve调试器。
如果业务程序需要指定参数,可以在以上命令中添加 -- 参数,如:
代码语言:txt复制dlv debug --headless --listen=:2345 --api-version=2 --accept-multiclient -- -conf-dir ./conf -log-dir
接着,我们选择步骤3配置的Go remote Configuration,点 Debug,在Goland上打断点,即可调试程序。
Python
同理,通过 pydevd 工具配置远程调试,详情参见:python 远程调试 的方案一。
Trick
- 配置代码同步快捷方式,因为自动同步有时间间隔,往往会出现本地更新代码未及时同步问题,可以手动在变更文件或项目根目录,通过快捷方式同步。
TODO
解决远程调试单元测试
dlv 支持 test,参见:https://github.com/go-delve/delve/blob/master/Documentation/usage/dlv_test.md:
代码语言:txt复制dlv test [package] -- -test.run TestSomething -test.v -other-argument
但目前看,似乎并没法像上面开启对单测的远程调试,需要进一步实践。