[工具]Vscode远程开发与远程调试

使用本地Vscode远程开发代码与远程调试

一直使用vscode写代码,也时常觉得vscode的设计挺符合微软的地位。简洁的界面,良好快捷方式,丰富的扩展是我使用vscode的原因。

vscode基于三个产品构建:Chromium 、 Electron 、Monaco-editor。
主要用TypeScript开发。

贴一下项目地址:
https://github.com/Microsoft/vscode/

另外,也经常有人拿vscode与JetBrains家的IDEA、Gland对比,要证明哪个好用。其实没有什么必要,用的顺手就行了。各有各自的特点,没有必要捧高踩低。

言归正传,最近发现了vscode的两个好用的功能——远程开发代码还有远程调试进程。

本地Vsode连接远程服务器

首先是远程开发代码的。
一般在服务端开发代码都是Linux命令行环境,比较常用的开发工具是Vim。但是,不熟悉Vim的人用起来不方便,比如我习惯了vscode的快捷方式与相应的扩展,转到Vim上就需要转换一下,效率比较低。

有没有一种方式,可以让我在服务端的环境中,也使用vscode开发?

或曰: 你本地开发完再放到服务端不就行了吗 😃

当然不是,这个可以借助一个vscode插件完成——Remote - SSH
插件地址:
https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh

Remote - SSH

Remote - SSH 可以让我们本地的vscode通过ssh连接远端的服务器,然后,可以在对应文件夹中开发代码(用的是本地的vscode界面)
另外,Remote - SSH还有另外两个兄弟:Remote - WSL 以及 Remote - Containers。故名思意,通过名字可以知道另外两个是连接什么的。

我们可以看一下怎么使用Remote - SSH。

操作步骤
  1. 首先下载Remote - SSH插件
  2. 下载完成之后,通过插件连接远端(我这里使用虚拟机测试)
    在这里插入图片描述
    输入的是 ssh 账户名称@IP ,然后就一路回车,中间需要你输入账户的密码。
  3. 输入密码连接完成,就有下面的提示:
    在这里插入图片描述
  4. 然后就可以通过本地的vscode界面开发,不管是新建文件也好,或者是直接修改代码也可以。但是,注意,有的插件远端是没有的,需要你另外安装——比如Go的插件就需要在远端重新安装。
    在这里插入图片描述

另外

使用Remote - SSH连接上远端之后,可以运行代码,可以调试。我写了一个http服务测试了一下,在本地确实可以访问。

所以,可以直接在vscode上调试代码。


这样,通过Remote插件,就可以用本地的vscode连接远端服务器开发了。直接保留了开发习惯。
vscode这个功能确实好用,不得不赞叹开源的强大。

Linux上适合Go开发的IDE

如果一定要在Linux上开发Go程序,vscode这样确实挺麻烦的,有的地方并不允许你远程连接。
这里推荐Linux下开发Go好用的IDE: spaceVim
文档:
https://spacevim.org/cn/documentation/
至于怎么安装,可以看我的另外一篇文章,Centos下直接使用shell脚本安装就可以了。
Centos下开发Go程序的环境安装
在这里插入图片描述

补充

上面介绍了Remote-SSH远程连接,在实际应用上面,还可以使用**Vscode + Remote-SSHLinux 源代码 ( 不会卡顿的那种 )。

具体应用可以看下面这篇文章:
https://mp.weixin.qq.com/s/pNdiDyAAOvMh7KfvNNj1Mg


但是,
万一,你并没有服务端相应的权限呢。。。
万一,你是开发维护一个守护进程呢。

这样好像就有点棘手了。

本地Vscode调试远端进程(Go语言)

下面就介绍使用本地vscode调试远端程序(或者进程),这个需要借助Go 的调试工具dlv完成。

需要条件
  1. 远端进程,知道进程号(或者你运行远端程序,得到进程号)。这里假设进程号为 204031。
  2. 拥有在远端执行dlv的权限。
  3. 本地安装有vscode (并没有要求Remote-SSH插件)
  4. vscode上,保留有与远端程序版本一致的代码。(代码版本要一致,远端可以没有这个代码——只要有进程)
操作步骤

具体怎么远程调试呢?

这里的原理我先说一下,核心就是利用dlv工具,使用dlv起一个dap server 服务,监听一个端口。而本地的vscode通过配置调试,连接这个端口,使用DAP协议通信和远端通信,进行远程attach调试。

  1. 启动程序,得到进程号,假设是204031

  2. 开启dlv dap服务,并dlv attach 到对应的进程上,随后启动dap server

    dlv --headless -l 0.0.0.0:204031 attach 214155--api-version 2
    
    #7488为进程号
    #dlv在哪个目录执行都可以
    #注意声明 --api-version 2
    
  3. 配置本地的调试文件——launch.json
    进入调试窗口,创建launch.json文件,针对Go语言的有package、file、Connect to server 三个选项。在这里插入图片描述
    选择connect to server之后,将配置信息补充完整:

    "configurations": [
    {
      "name": "Connect to server",
      "type": "go",
      "request": "attach",
      "mode": "remote",
      // 注意!!非常关键,这是能否成功设置断点的关键参数。
      "remotePath": "{编译的项目路径}",
      // dlv server 启动的端口
      "port": 2345,
      // 远程主机的 IP
      "host": "192.168.xx.xx"
     }
    ]
    

    例如:
    在这里插入图片描述
    remotePath这个参数非常关键,是你能否远程设置断点成功的关键。它不是进程当前的目录,也不是本地项目的代码目录,而是编译二进制项目的目录。

  4. 运行调试
    服务端启动,客户端配置好之后。就可以在本地代码上设置断点,然后启动调试,就能够在本地vscode上看到调试信息。这样就可以实现远程调试。

再次赞叹一下vscode的方便以及开源社区的强大,从容器之争的过程就能够看到开源社区强大的力量,所以,我觉得后面vscode会有更多好用的功能。如果还有好用的插件推荐,欢迎在评论区分享 😃 。

补充应用

关于远程调试的应用的,可以通过vscode调试容器里的应用。

  1. 构建容器镜像
# 基础镜像
FROM golang:latest
# 下载dlv工具
RUN GOPROXY=https://goproxy.cn go get github.com/go-delve/delve/cmd/dlv
# 创建工作目录
RUN mkdir -p /go/src/app
WORKDIR /go/src/app
# 拷贝主机当前文件到工作目录
COPY . /go/src/app
# RUN go build -gcflags "all=-N -l"
# CMD ["dlv", "debug", "--headless", "--listen=:2345", "--log", "--api-version=2" ]
# 默认执行命令
CMD ["dlv", "debug", "--headless", "--listen=:2345", "--log", "--api-version=2"]

然后docker build -t app .
2. 配置launch.json文件

{
    "version": "0.2.0",
    "configurations": [

        {
            "name": "Launch remote",
            "type": "go", 
            "request": "launch",
            "mode": "remote", // 开启远程模式
            "remotePath": "/go/src/app", // 远端main文件所在目录,必须是绝对路径
            "port": 2345, // dlv服务的暴露端口号
            "host": "192.168.0.250", // dlv服务的ip即docker容器所在主机的ip
            "program": "${workspaceRoot}",// 本地main文件所在的目录
            "env": {}
        }
    ]
}
  1. 启动容器
docker run --rm --name webapp --security-opt="seccomp=unconfined" -cap-add=SYS_PTRACE -p 2345:2345 app
  1. 然后就可以打断点调试了

总结一下,今天介绍了使用本地vscode远程开发还有远程调试的方法。

  • 远程开发可以通过Remote-SSH插件连接远端,完成开发与调试。
  • 远程调试只是针对Go程序,借助dlv,远程启动dap服务,然后本地vscode调试环境连接这个服务,就可以在本地代码打断点调试了。需要注意,代码版本要一致。并且,远端可以只是进程没有代码,本地一定要有代码。
  • 好用的东西就是要分享 😃

参考资料

go调试【翻译】 https://juejin.cn/post/6844904087763304462
用vscode调试 https://juejin.cn/post/7080135520902184997
调试docker里的go https://juejin.cn/post/6844904165517312013
程序是调出来的 https://www.modb.pro/db/377704
dlv介绍 https://www.likecs.com/show-133461.html
dlv使用 https://www.jianshu.com/p/4f3c2e913915

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值