Keen的博客

记录所思、所想、所遇

欢迎来到我的个人站~


【调试技术】VSCode远程开发

VSCode远程开发

1. 开发环境

最近做后台需求比较多,使用到了CentOS Mini版本的系统。由于没有界面,开发需求都是在Windows通过VSCode开发完成,然后通过ssh传输源代码到CentOS系统上,进而进行日志级别调试。开发同学都知道,这种靠日志行为的调试,效率极低。微软也为此大费精力,为了提升大家开发效率,设计了多种远程调试方法。

launch.json是传统的远程调试方法,通过更改配置文件,能把调试目标重定向到远端系统上。
Remote-SSH插件(当然,还有Remote-Docker、Remote-WSL插件,这里我只涉及到最常规的Windows + 本地VMWare虚拟机内Linux系统的开发环境,所以使用Remote-SSH在我工作中最为常见),这个相比launch.json的方式,更为炫酷,也是微软最近才推出的一款官方插件(2019.5月)。Remote - SSH

  • 宿主机:Windows 10 + VSCode + go环境
  • 目标机:VMWare + CentOS7.3 Mini + go环境,IP:192.168.2.132,源码路径:/opt/go/src/test_remote

源代码(test_remote\main.go)

package main

import (
	"fmt"
	"strings"
)

func printsss(s string) {
	if strings.Contains(s, "/") {
		// 找到s的上一层
		pos := strings.LastIndex(s, "/")
		printsss(s[:pos])
	}

	fmt.Println(s)
}

func main() {
	a := "/abc/ddd/dede/"
	a = strings.Trim(a, "/")
	printsss(a)
}

2. 基于launch.json的远程调试方法

2.1 在目标机,安装delve调试器

go get -u github.com/derekparker/delve/cmd/dlv

2.2 在目标机上,启动delve debug服务

cd /opt/go/src/test_remote
dlv debug --headless --listen=:2345 --log --api-version=2

jpg

2.3 在宿主机上,配置远程调试

选择:debug ——> Add Configuration ——> Go: Connect to server

launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Connect to server",
            "type": "go",
            "request": "attach",
            "mode": "remote",
            "remotePath": "/opt/go/src/test_remote",    // 设置虚拟机内的源码路径目录
            "port": 2345,
            "host": "192.168.2.132",
            "program": "${fileDirname}",    // 注意,这里设置的是当前本机的源码路径目录,与remotePath对应上,且两边的代码必须保持同步。虽然提示说不兼容这个设置项,但是一定要设置
        },
        {
            "name": "Launch",
            "type": "go",
            "request": "launch",
            "mode": "auto",
            "program": "${fileDirname}",
            "env": {},
            "args": []
        }
    ]
}

2.4 选择Connect to server,启动调试

选择Connect to server,然后F5,启动调试,这里宿主机上,已经可以看到调试运行起来了。

jpg

目标机上,调试也正在执行

jpg

2.5 如何确保两边代码同步

注意:由于这里的调试,非常依赖两边代码完全一样,所以代码同步,是比较常见的动作。常规的拷贝代码,会比较繁琐,这里可以采用自动代码同步方案

VSCode中,搜索并安装SFTP插件,使用步骤如下:

# ctrl+shift+p,然后输入SFTP:config
# 编辑如下:
{
    "name": "My Server",
    "host": "192.168.2.132",
    "protocol": "sftp",
    "port": 22,
    "username": "root",
    "remotePath": "/opt/go/src/test_remote",
    "uploadOnSave": true,
    "password": "xxxxxx"
}
# ctrl+shift+p,然后输入SFTP:Sync Local ——> Remote,可以把本机内容,同步到远端。相反,使用SFTP:Sync Remote ——> Local,可以把远端的内容,同步到本地

3. 基于Remote-SSH插件的远程调试方法

使用Remote-SSH插件,完全的远程开发概念,可以让代码跑在远端Linux,而实际调试则利用Windows开发机的VSCode的可视化调试方案。完全将代码和调试环境分离,无需保持本地和远端代码同步,因为代码无需放在本地,直接放在远端机器即可。基本原理,可用如下图表示:

png

基本使用方法,参考https://code.visualstudio.com/docs/remote/ssh。这里以当前(Windows + VSCode) + (VMWare + CentOS)为例,记录使用步骤。

3.1 在宿主机上,安装OpenSSH

需要先在宿主机(Windows 10)上,安装OpenSSH。这里,如果是win10以前的版本,需要安装Git

3.2 目标机器,需要开启SSH服务

CentOS默认支持SSH服务,这时需要开启SSHD

systemctl enable sshd.service
systemctl start sshd.service

3.3 在宿主机的VSCode中,安装并配置Remote - SSH插件

安装完Remote - SSH插件后,会在左边侧边栏,产生一个远程入口,点击配置,会进行选择一个.ssh的config,进入配置后如下:

png

配置准备好后,就可以双击配置项,会新启动一个窗口,然后使用Open的时候,会从远端打开某个目录进行开发调试,跟在本地是一样的。打开一个/opt/go/src/test_remote目录后,如下:

jpg

这个时候,运行F5,是找不到go调试环境的,因为远端还没有安装vscode-go的调试环境。

jpg

安装结束后,reload一下go插件,这样,就可以正常调试里,跟在本地调试代码完全一样的体验。查看此时的terminal,可以看到链接到远端去了。

jpg

3.4 SSH免密登录

生成密钥对,我这里选择在Win10机器上生成。

# 生成MyLinuxRsa私钥和MyLinuxRsa.pub公钥
ssh-keygen -t rsa -f c:\Users\keenjin\.ssh\MyLinuxRsa

# 将公钥,拷贝到服务器上
cd ~/.ssh/
ls
# 如果authorized_keys文件不存在,则创建
vim authorized_keys
chmod 600 authorized_keys

rz  # 在CentOS中执行rz命令,然后将c:\Users\keenjin\.ssh\MyLinuxRsa.pub文件,上传过去
cat MyLinuxRsa.pub >> authorized_keys

# 更改CentOS上的ssh的配置,确保支持密钥登录/etc/ssh/sshd_config
# 注意,以下几项必须要有
···sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys
···

# 在Win10机器上,配置ssh的私钥文件
# 编辑c:\users\keenjin\.ssh\config,设置私钥文件
···config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config
Host Linux
    HostName 192.168.2.132
    User root
    IdentityFile C:\Users\keenjin\.ssh\MyLinuxRsa
···

# 远程连接选用c:\users\keenjin\.ssh\config配置登录

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少