调试方式
- 打印/日志调试:依赖fmt.Println、log等方式进行调试,显得非常麻烦,每次都要在指定代码位置敲代码,调试完成还需要删掉调试代码,也不能完整的展示调用过程,有一定的局限性,过程也很麻烦,也容易出错。
- 本地debug调试:依赖GoLand进行本地调试,GoLand集成了debug工具,开箱即用,调试本地运行的项目,很方便,但是远程调试,就需要其他监听工具的协助了。
- Delve远程调试:利用delve工具在本地和远程服务器之间建立一个端口监听,对远程服务器的指定进程进行监控,将收集的运行信息传回本地,再由GoLand进行接收并格式化处理。
Delve工具的使用
- 安装:根据如下命令在服务器上安装Delve工具。
[root@fm-train ~]# go get -u github.com/go-delve/delve/cmd/dlv
- 编译:这里在编译代码的时候,需要加入-gcflags 参数给编译器传递-N -l参数,禁止编译器优化和内联,具体编译命令如下:
[root@fm-train ~]# go build -gcflags "all=-N -l" github.com/app/demo
- 服务器端的操作:
- 获取服务器端运行的应用的pid
ps -ef |grep zqkd_rec|grep "config.json.production"|awk '{print $2}'
- 启动服务端应用的监听,命令如下:
dlv attach PID --headless --api-version=2 --log --listen=:2345
- 本地GoLand设置
-
Run->Debug->Edit Configurations...,进入如下图界面:
-
- 调用接口,这时接口会处于block状态。
-
回到GoLand,Run->Debug,弹框中选择刚建立的debug。
-
接下来会出现调试界面,如下图:
缺点
- 每次修改代码,都要重新进行build并且重新启动dlv监听,不过可以写一个shell脚本,自动执行这一系列命令,涉及到本地与服务端交互,可能会用到expect工具。
-
如果需要更换断点的话,不要点击GoLand的停止键和返回键,需要通过Resume键执行完本次所有断点,具体按键如下图:
写在最后
- 如果有哪里有问题,可以在评论区指出,作者会及时改正,大家共同讨论,共同进步。