goland远程调试

前言

之前写过一个goland本地调试,为什么可以本地调试还要远程调试呢?

首选声明一点,本地调试是首选,如果可以本地调试,那自然是本地调试最方便。

但是,本地环境和实际环境很多时候是不一样的,很难在本机搭建出与线上完全相同的环境,比如我们想调试数据库、调试rpc、调试服务注册发现,这些线上都是现成的,但在我们本机就很难复制,再比如线上的网络和我们本机的网络环境是不一样的,这些场景下本地调试均无法满足我们的需求,需要把我们的程序部署在线上环境,才能测试。

之前不知道远程调试,我都是改好了程序,push到git上,然后到线上的机器pull下来,编译,运行,看日志。。。一方面,每次改完程序想测试一下,很繁琐,另一方面,完整的开发完一个feature,产生了几十次commit。。。

好在,goland有远程调试功能!

有了远程调试,在goland写完代码,直接同步到远端机器,然后点小虫子按钮调试,然后设断点。。。嗯,就基本上跟本地调试一样方便了。

说明

在说具体配置方式之前说明几点:

1.配置过程不需要翻墙,配置过程中会从github下载一些东西,会很慢,但是可以!

2.本地的gopath和远端机器不需要一致,go版本也不需要一致,如果你本地和远端都有go环境,无需做任何调整!

总之就是,配置成本不高,很easy~

远端机器配置

远端机器配置说明

我的远端机器是百度云的服务器,系统是ubuntu1604,配置如下:

嗯,就是最便宜的那款。。。

go版本是1.12.4。

gopath如下。

注意,这里只是为了说明,go版本和gopath真的无所谓,因为后面你会发现这跟我本机的配置完全不一样。

安装dlv

下面开始装东西,其实只需要装一个delve,这是个啥呢,直接贴上github上的简介吧。

想看更详细的可以直接去github看readme,链接:GitHub - go-delve/delve: Delve is a debugger for the Go programming language.

安装方式也是按官方的来的,只不过实际操作的过程中,发现直接go get需要翻墙,git clone下来之后make install也需要翻墙。。。好在,可以自己先下载好需要的包,这样就不用翻墙了,具体命令如下:

这里参考了这篇博文unrecognized import path "golang.org/x/sync_疯狂小二丶的技术博客_51CTO博客,歪打正着的解决了我的问题,在此表示感谢~

go get完成之后,输入dlv,看到以下信息说明安装成功。

如果提示找不到dlv命令,如下图,

说明其安装路径不在PATH里,需要手动添加,添加方式如下:

1.找到安装好的dlv命令

发现在这两个地方。

随便挑一个软连接到go命令的路径,因为go的路径是配置在PATH里的。

然后再输入dlv,嗯,肯定就可以了。

dlv安装成功之后,远程机器的配置就告一段落,下面进行本地goland配置。

本地goland配置

本机配置说明

macOS系统,不要羡慕,公司的。。。

go版本1.13.4.

gopath如下。

总算是呼应上了最开始说明的,go版本和gopath都不需要一样。

goland安装remote hosts access插件

想要远程调试,需要goland有一个叫做remote hosts access的插件(有个朋友跟我说她那叫FTP/SFTP Connectivity,可能是更新换代了),我看网上很多goland远程调试相关的博文,第一步都是安装这个插件,但是我的goland好像自带这个插件,所以并没有装。。。总之,这个插件是一定要有的,你可以先去看看自己的goland有没有,没有的话就装一个,查看方式如下:

1.点击preference

2.选中左侧plugin,然后搜索remote,如果在installed里找到,说明有了,如果没有,那就安装吧。。。

添加远程服务器信息

确定有了这个插件之后,开始将你的远端服务器信息配置进去,步骤如下:

1.点击tools->deployment->configuration

2.点击坐上角的加号,选择sftp,就是安全的ftp,linux系统上都是这个,而不是ftp

3. goland是通过ssh连接你的服务器,所以需要填你的服务器ip,ssh端口(默认22),以及用户名密码,记得勾选上save password,不然以后每次调试都要输入一次密码

4.输入完远端服务器ssh信息之后,点击Test Connection按钮测试一下是否连接上,如果是下图这样,说明连接成功了

5.接下来配置mapping,就是你的本地文件夹,映射为远端的哪个文件夹

注意,我这里配置成了和本地一样的路径,这不是因为我懒直接复制的,而是,只有配置为这个路径,我才调试成功了。。。

我相信,不应该是这样的,但是事实是,如果我改成其他文件夹,断点信息都无法同步到远端,这个的原因,暂时没有找到,希望能有高人指点。。。

先忽略这个问题继续下去吧。。。

点击右下角的ok,这里就配置完成了。

上传程序到远程服务器

配置完远程服务器信息之后,就可以把你本地的程序上传到你刚才在mapping里配置的那个远程文件夹了

首先点击一下左侧的项目文件夹,否则,会默认上传当前的.go文件

然后,点击tools->deployment->upload to...

然后,你就可以去你的远端服务器看一下,文件是不是传过去了。

goland界面配置

这里推荐完全使用goland提供的工具,告别iterm、xshell这些工具,且能以图形化的方式操作远端文件。

1.点击tools->deployment->browse remote host

然后你就发现,goland里出现了远端的文件系统,在这里你可以直接查看,甚至操作远端文件!

2.直接在goland下方的terminal里ssh连接远端服务器

完成了这两步,你就会发现,远程调试,完全不需要跳出goland这个界面,简直不要太方便!

配置远程调试

接下来,配置远程调试,步骤如下:

1.点击右上角的配置

2.新增配置,选择go remote

3.配置远程服务器信息,端口就用默认的就好

注意上图中圈起来的那条命令,那是之后需要执行的,这个页面给了两种命令,第二种里面说的github.com/app/demo,我实在不知道是啥,所以用了第一种。。。

到这里,全部配置完了,接下来就到了见证成果的时刻!

远程调试

在开发机上执行以下命令:

1.进入mapping里配置的那个远程文件夹

2.执行上面截图里那个命令,注意不带最后一个参数,就是那个--accept-multiclient,带上的话,命令执行完之后无法退出,不知道为啥。。。另外解释一下,这个命令,同时完成了编译和运行,如果运行程序需要声明参数,直接加在后面就好了~

执行完成后,效果如下图所示,嗯,已经开始监听2345端口了,就等着来自我们本机的操作了。

然后,goland上就可以开始调试了,可以先设置好断点,也可以程序跑起来再设,都欧克。我这里跑一个简单的小程序,就直接设置好断点了。

然后就可以点击右上角的小虫子开始调试了。

然后,你就会发现,程序像是在本地调试一样,停在了断点出,下方出现了调试信息!

嗯,是没错,这表示大功告成了,哈哈。

之后,想远程调试代码,只需要修改代码之后,upload到远端,然后用dlv命令把程序跑起来,就可以像本地一样调试程序啦~