工欲善其事,必先利其器。好的工具可以更快更精准完成工作,提高做事的愉悦程度,甚至给人启发。本文讲述如何用goland配合dlv调试远程的go程序。vscode有类似的方式,可以结合本文后自行查阅资料。
很多时候我们喜欢用自己已知的知识去解决问题,就好像是有一个锤子,看什么都是钉子的思维一样。类似于打印日志去调试就是非常笨的方式,时间一长整个人都不好了。跳出自己的舒适区主动去学习成长,才能打破自身的限制。用方法,提高效率去解决问题,而不是靠时间感动自己。越卷只能越菜。
为什么需要远程调试
- 本地机器配置跟不上,调试起来太卡
- 远程服务器(研发云,sim环境)有更加完备的上下游环境、配置文件、硬件(例如GPU)、特殊的依赖库(linux与windows)
- 需要在特定环境复现问题
远程调试的优势
- 可视化调试界面,减少心智负担
- 本地机器负载小
- 调试时间更快,减少繁琐的打印日志定位问题的方式
- 心情愉悦
远程调试有两个方面,如何将本地编辑的代码保存到远端,如何在本地调试远程程序。
代码同步方式
- 通过git仓库同步
- goland提供了sftp同步本地文件到远程服务器的方式,简单的项目可以应用,但是复杂的项目不好用
- 用vscode 的remote ssh
- goland最新版本(2021.3)支持Remote Development,目标是编辑远端go代码,就像操作本地代码一样(有完整的索引跳转支持),目前试用效果比较强大
调试远程程序
服务器安装dlv
$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv注意安装的delve 需要和使用的go版本匹配,最新的delve建议使用go1.16以上
安装后所在目录:
ls $(go env GOPATH)/bin/dlvplutus需要安装redis
yum install redis
redis-server /etc/redis.conf编译(go1.10以上)
go build -o plutus -gcflags=all="-N -l" main.go-N 禁止编译器优化
-l 禁止内联
服务器端程序运行
// elvish 需要的库
export LD_LIBRARY_PATH=/root/elvish-lib-golang/icu/icu_Linux/lib:$LD_LIBRARY_PATH
/root/go/bin/dlv --listen=:2345 --headless=true --api-version=2 --accept-multiclient --check-go-version=false exec ./plutus -- -config=conf/conf.test.toml(option)dlv支持两种启动方式,一种是直接用dlv启动go服务进程,另外一种是将dlv server attach到已经运行的go服务进程上。例如sim环境下程序已经启动,
dlv --listen=:8015 --headless=true --api-version=2 --log attach 13935 # 注意 8015端口是 dlv server的监听端口,这里的端口范围可以在8000-8100之间,注意别跟机器上的服务端口冲突即可本地goland配置
注意保证服务器和客户端的代码一致!
右上角edit Configurations
+ → Go Remote → 添加ip地址与端口
调试
调用远程服务接口,并在本地合适的地方打上断点,和goland调试本地代码一样。
参考资料