之前写过一个goland本地调试,为什么可以本地调试还要远程调试呢?
首选声明一点,本地调试是首选,如果可以本地调试,那自然是本地调试最方便。
但是,本地环境和实际环境很多时候是不一样的,很难在本机搭建出与线上完全相同的环境,比如我们想调试数据库、调试rpc、调试服务注册发现,这些线上都是现成的,但在我们本机就很难复制,再比如线上的网络和我们本机的网络环境是不一样的,这些场景下本地调试均无法满足我们的需求,需要把我们的程序部署在线上环境,才能测试。
之前不知道远程调试,我都是改好了程序,push到git上,然后到线上的机器pull下来,编译,运行,看日志。。。一方面,每次改完程序想测试一下,很繁琐,另一方面,完整的开发完一个feature,产生了几十次commit。。。
好在,goland有远程调试功能!
有了远程调试,在goland写完代码,直接同步到远端机器,然后点小虫子按钮调试,然后设断点。。。嗯,就基本上跟本地调试一样方便了。
在说具体配置方式之前说明几点:
1.配置过程不需要,配置过程中会从github下载一些东西,会很慢,但是可以!
2.本地的gopath和远端机器不需要一致,go版本也不需要一致,如果你本地和远端都有go环境,无需做任何调整!
总之就是,配置成本不高,很easy~
我的远端机器是百度云的服务器,系统是ubuntu1604,配置如下:
嗯,就是最便宜的那款。。。
go版本是1.12.4。
gopath如下。
注意,这里只是为了说明,go版本和gopath真的无所谓,因为后面你会发现这跟我本机的配置完全不一样。
下面开始装东西,其实只需要装一个delve,这是个啥呢,直接贴上github上的简介吧。
想看更详细的可以直接去github看readme,链接:https://github.com/go-delve/delve
安装方式也是按官方的来的,只不过实际操作的过程中,发现直接go get需要,git clone下来之后make install也需要。。。好在,可以自己先下载好需要的包,这样就不用了,具体命令如下:
mkdir -p $GOPATH/src/golang.org/x
cd $GOPATH/src/golang.org/x
git clone https://github.com/golang/net.git
git clone https://github.com/golang/sys.git
git clone https://github.com/golang/arch.git
git clone https://github.com/golang/sync.git
git clone https://github.com/golang/tools.git
cd $GOPATH/src
go get -u github.com/go-delve/delve/cmd/dlv
这里参考了这篇博文https://blog.51cto.com/13740724/2318397,歪打正着的解决了我的问题,在此表示感谢~
go get完成之后,输入dlv,看到以下信息说明安装成功。
如果提示找不到dlv命令,如下图,
说明其安装路径不在PATH里,需要手动添加,添加方式如下:
1.找到安装好的dlv命令
sudo find / -name dlv
发现在这两个地方。
随便挑一个软连接到go命令的路径,因为go的路径是配置在PATH里的。
ln -s /home/ubuntu/go/bin/dlv $GOROOT/bin
然后再输入dlv,嗯,肯定就可以了。
dlv安装成功之后,远程机器的配置就告一段落,下面进行本地goland配置。
macOS系统,不要羡慕,公司的。。。
go版本1.13.4.
gopath如下。
总算是呼应上了最开始说明的,go版本和gopath都不需要一样。
想要远程调试,需要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提供的工具,告别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里配置的那个远程文件夹
cd /Users/dongjiaqi/testBuild/
2.执行上面截图里那个命令,注意不带最后一个参数,就是那个--accept-multiclient,带上的话,命令执行完之后无法退出,不知道为啥。。。另外解释一下,这个命令,同时完成了编译和运行,如果运行程序需要声明参数,直接加在后面就好了~
dlv debug --headless --listen=:2345 --api-version=2
执行完成后,效果如下图所示,嗯,已经开始监听2345端口了,就等着来自我们本机的操作了。
然后,goland上就可以开始调试了,可以先设置好断点,也可以程序跑起来再设,都欧克。我这里跑一个简单的小程序,就直接设置好断点了。
然后就可以点击右上角的小虫子开始调试了。
然后,你就会发现,程序像是在本地调试一样,停在了断点出,下方出现了调试信息!
嗯,是没错,这表示大功告成了,哈哈。
之后,想远程调试代码,只需要修改代码之后,upload到远端,然后用dlv命令把程序跑起来,就可以像本地一样调试程序啦~