介绍

有时候本地环境很难实现“完整的线上环境”的现场,怎么使用goland这个“go语言最强IDE”进行远程线上进行Debug呢?这里将给你答案。

实现步骤

准备工作

  1.  生产环境的可以跑go项目的机器(远程机)
  2. Goland
  3. dlv 工具

操作过程

1. 将你编译好的go语言二进制文件上传到远程机

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build cmd/myproject.go 

将项目编译出linux的二进制文件: myproject

你可以通过scp将你的文件上传到远程机

scp -i <ssh-key> <二进制文件> <远程机hostname>@<远程机ip>:<远程机存放二进制文件的路径>

比如: 

 scp  -i ~/work/share/sshkey/mykey.sshkey  ./myproject  centos@my-node:/home/myfold/myproject

 

远程机要能够运行go语言项目,需要安装go编译器,如何在linux安装go 编译器,如果是ubuntu系统可以参考:

How to install Go [golang] on Ubuntu Linux

2. 在远程机器上本地安装dlv 工具

dlv的官方地址可以参考:全球最大同性交友网站的github

具体过程为:

$ git clone https://github.com/go-delve/delve
$ cd delve
$ go install github.com/go-delve/delve/cmd/dlv

golang 1.16或者后面版本可以参考:

# Install the latest release:
$ go install github.com/go-delve/delve/cmd/dlv@latest

# Install at tree head:
$ go install github.com/go-delve/delve/cmd/dlv@master

# Install at a specific version or pseudo-version:
$ go install github.com/go-delve/delve/cmd/dlv@v1.7.3
$ go install github.com/go-delve/delve/cmd/dlv@v1.7.4-0.20211208103735-2f13672765fe

3. 在远程机上运行golang项目

- 将golang二进制在远程机上运行。

~/go/bin/dlv --listen=:2345 --headless=true --api-version=2 exec ./myproject 

我们可以发现,远程机的dlv工具(服务端)使用2345 端口为提供一个用于远程myproject 的服务,用于本地dlv(客户端)的连接。

 4. 本地使用tunnel 代理连接远程机器连接 (如果不需要代理,可以忽略这一步)

本地的tunnel可以使用ssh 来完成:

ssh -L 2345:<远程代理的机器>:2345 -N -i ~/.ssh/sshkey <远程机hostname>@<远程机ip>

这样一来,本地就可以用2345端口连接跟远程机器的23452345端口联通。

5. 本地配置goland 实现远程线上debug

打开goland (mac 版本):

goland- > Run -> edit Configurations... -> 新增一个run 配置 ;

然后使用本地的2345 端口来进行debug。(由于你使用代理或者直接连接2345来连接远程机的2345端口,所以你要配置这个端口来进行)

 

然后就可以在本地goland 设置断点,然后点击debug进行在线debug了。

注意:

本地的代码必须和远程机上的go程序二进制完全相同。如果本地代码变动了,必须再重新编译一个新的二进制代码到远程机上,二者必须实时相同。