工欲善其事,必先利其器。好的工具可以更快更精准完成工作,提高做事的愉悦程度,甚至给人启发。本文讲述如何用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/dlv

plutus需要安装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调试本地代码一样。

参考资料