VSCode远程开发调试服务器c/c++代码

语音相关的好多项目要在linux上跑,但代码开发大多是在PC机上,本篇简单介绍一下怎么在个人电脑上用VSCode远程开发调试服务器上的c/c++代码。

思路与上篇(PyCharm远程调试服务器python代码 )是一致的,所以端口转发这部分直接照抄上篇:

一、端口转发

对于没有公网IP的远程训练服务器,需要先配置端口转发,可以用ssh借道有办公网IP的办公机器。

0、公司给配置了一台Ubuntu系统的台式机器A,开发时想用Windows笔记本B,把远程CentOS训练服务器记为C。

1、首先需要修改台式机A上的ssh配置文件,如果不修改配置的话,将只有机器A可以访问训练服务器C。

$ sudo vim /etc/ssh/sshd_config

添加:

GatewayPorts yes
PasswordAuthentication yes

然后重启机器A的sshd服务使上述配置生效。

$ sudo systemctl restart sshd

2、在训练服务器C上向机器A主动建立SSH连接,转发训练服务器C的22号端口

3、用ssh命令转发端口,ssh -NTf -R 转发端口号:localhost:22 机器A的用户名@机器A的IP

$ ssh -NTf -R 2333:127.0.0.1:22 zhuangweiji@10.220.12*.25*

输入密码后就在后台运行了

4、验证,在机器B上

$ ssh zhuangweiji@10.220.12*.25*

登陆上的话就证明ssh隧道建立成功了

5、理论上,A和B可以是同一台机器,也就是C可以直接把端口转发给有pycharm的开发机器。不过由于我的开发机上下班会带着移动,移动过程中SSH不能保持连接,经常要重新配置IP,所以选择了用办公室的台式机中转。

二、免密登录

0、端口转发完成后,在windows机器B上,本地cmd窗口生成公钥和密钥(密钥默认放在C:\Users\用户名\.ssh下)

    ssh-keygen -t rsa -b 4096

1、把公钥添加到A机器的公钥集,法1:

将公钥id_rsa.pub复制到机器A的~/.ssh文件夹下,重命名为id_rsa_x260.pub(我的机器是x260),并将其追加到A机器的公钥集里

    cat id_rsa_x260.pub >> authorized_keys

2、把公钥添加到A机器的公钥集,法2:

    ssh-copy-id username@10.221.*.*

会自动把公钥append到A机器的$HOME/.ssh/authorized_keys里

三、安装 OpenSSH

0、Windows 10 机器 上需要安装 OpenSSH,管理员身份打开 PowerShell

    Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
    Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

 

四、远程开发调试

0、打开 VSCode,添加插件 Remote Development, 会自动安装 Remote-Container, Remote-SSH 及 Remote-WSL 全家桶,也可以只安装Remote-SSH。

1、安装好插件之后,右侧边栏选择remote explorer,下拉菜单栏选择SSH target,再点击configure小齿轮

 

2、选择c:\user\用户名\.ssh\config,添加如下信息

 

3、Hostname 填机器A的ip,port填转发的端口,填入用户名,由于已经在A机器上添加公钥,因此不需要密码。

保存后,ssh targets里面就会出现机器A,点击connect to host in new window之后,就可以直接在新窗口中访问机器C。

 

4、插件被分成了本地和远程两部分,本地插件不能在远程使用,需要重新安装

 

五、远程开发gdb调试

1、编辑文件:

// File -> New File -> remote_gdb_debug.cpp

 

#include <iostream>

using namespace std;

int main() {

    int age;

    age = 18;

    cout << "I'am " << age << " years old!" <<endl;

    return 0;

}

2、安装gdbserver

yum install gdb-gdbserver

 

3、在服务器端转发gdbserver端口

ssh -NTf -R 2333:127.0.0.1:2333 username@ip

 

4、 打开配置文件 launch.json,配置如下:

//launch.json

{  

 "version": "0.2.0",  

 "configurations": [  

        {  

         "name": "(gdb) Launch", // 配置名称,将会在启动配置的下拉菜单中显示  

            "type": "cppdbg",       // 配置类型,这里只能为cppdbg  

         "request": "launch",    // 请求配置类型,可以为launch(启动)或attach(附加)  

            "program": "${workspaceFolder}/${fileBasenameNoExtension}",// 将要进行调试的程序的路径  

            "args": [],             // 程序调试时传递给程序的命令行参数,一般设为空即可  

            "stopAtEntry": false,   // 设为true时程序将暂停在程序入口处,一般设置为false  

         "cwd": "${workspaceFolder}", // 调试程序时的工作目录,一般为${workspaceFolder}即代码所在目录  

            "environment": [],  

         "externalConsole": false, // 调试时是否显示控制台窗口,一般设置为true显示控制台  

            "MIMode": "gdb",  

         "miDebuggerPath": "gdb", // miDebugger的路径

            "preLaunchTask": "g++", // 调试会话开始前执行的任务,一般为编译程序,c++为g++, c为gcc  

        "miDebuggerServerAddress": "ip:port",

         "setupCommands": [  

                {   

            "description": "Enable pretty-printing for gdb",  

                    "text": "-enable-pretty-printing",  

                    "ignoreFailures": true  

                }  

            ]  

        }  

    ]  

}

 

几个注意的地方:

  • 应该是 "request": "launch", 不是 “attach”, 此后也并不需要记录进程ID

  • 需要填对 "miDebuggerServerAddress": "ip:port", 有这个设置才会开启 gdb 远程调试

  • "engineLogging": true 可以看到 gdb 自身的详细消息

  • 必须是 "externalConsole": false 否则报错

  • program 应该是在 gdbserver 和 launch.json 里都要填一次

 

// tasks.json

{

    // See https://go.microsoft.com/fwlink/?LinkId=733558 

    // for the documentation about the tasks.json format

    "version": "2.0.0",

    "tasks": [

        {

            "type": "shell",

            "label": "g++", //这里注意一下,见下文

            "command": "g++",

            "args": [

                "-g",

                "${file}",

                "-o",

                "${fileDirname}/${fileBasenameNoExtension}",

                "-ggdb3",   // 生成和调试有关的信息

                "-Wall",    // 开启额外警告

                "-static-libgcc",   // 静态链接

                "-std=c++11",       // 使用c++11标准

                "-finput-charset=UTF-8",    //输入编译器文本编码 默认为UTF-8

                "-D _USE_MATH_DEFINES"

            ],

            "options": {

                "cwd": "${fileDirname}"

            },

            "problemMatcher": [

                "$gcc"

            ],

            "presentation": {

                "echo": true,

                "reveal": "always", // 在“终端”中显示编译信息的策略,可以为always,silent,never

                 "focus": false,

                 "panel": "shared" // 不同的文件的编译信息共享一个终端面板

            },

        }

    ]

}

 

5、远程机器上运行 gdbserver

gdbserver localhost:2333 ./remote_gdb_debug

 

6、vscode中开始远程debug

设置断点,Run -> Start Debugging

 

六、debug linux 上已经编译好的文件

1、在服务器端转发gdbserver端口

ssh -NTf -R 2333:127.0.0.1:2333 username@ip

 

2、远程机器上运行 gdbserver

gdbserver localhost:2333 ./bin

 

3、vscode中进入目标路径,打开配置文件 launch.json,配置如下:

{

    // 使用 IntelliSense 了解相关属性。 

    // 悬停以查看现有属性的描述。

    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387

    "version": "0.2.0",

    "configurations": [

        {

            "name": "(gdb) Remote Launch",

            "type": "cppdbg",

            "request": "launch",

            "miDebuggerServerAddress": "ip:port",

            "program": "bin_path",

            "args": [],

            // "stopAtEntry": false,

            "stopAtEntry": true,

            "cwd": "${workspaceFolder}",

            "environment": [],

            "externalConsole": false,

            "sourceFileMap": {

                "/build": "/build"

            },

            "logging": {

                "engineLogging": false

            },

            "MIMode": "gdb",

        }

    ]

}

 

4、vscode中开始远程debug

Run -> Start Debugging

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值