Go项目远程调试

调试方式

  • 打印/日志调试:依赖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
  • 服务器端的操作:
    1. 获取服务器端运行的应用的pid
    ps -ef |grep zqkd_rec|grep "config.json.production"|awk  '{print $2}'
    
    1. 启动服务端应用的监听,命令如下:
     dlv attach PID --headless --api-version=2 --log --listen=:2345
    
  • 本地GoLand设置
    1. Run->Debug->Edit Configurations...,进入如下图界面:


      图一
  • 调用接口,这时接口会处于block状态。
  • 回到GoLand,Run->Debug,弹框中选择刚建立的debug。


    图二
  • 接下来会出现调试界面,如下图:


    图三

缺点

  • 每次修改代码,都要重新进行build并且重新启动dlv监听,不过可以写一个shell脚本,自动执行这一系列命令,涉及到本地与服务端交互,可能会用到expect工具。
  • 如果需要更换断点的话,不要点击GoLand的停止键和返回键,需要通过Resume键执行完本次所有断点,具体按键如下图:


    图四

写在最后

  • 如果有哪里有问题,可以在评论区指出,作者会及时改正,大家共同讨论,共同进步。

你可能感兴趣的:(Go项目远程调试)