windows下vscode调试虚拟机linux c++工程的三种方法

vscode去远程调试方法有很多种,不同的插件对应了不同的调试方法,比如:

  • 1.C/C++插件进行GDB调试(编写launch.json文件)
    在这里插入图片描述

  • 2.C/C++ Runner插件
    在这里插入图片描述

  • 3.CMake Tools插件(只针对CMake工程,需要搭配C/C++插件一起使用,但无需编写launch.json)
    在这里插入图片描述

  • 4.其他方法(^ _ ^)

1. 方法一:使用C/C++插件

此方法在我远程连接调试Hyper-V虚拟机时,GDB会卡主=。=

1. 配置c_cpp_properties.json

因为是远程连接的虚拟机中的文件夹,这里刚连接成功并没有.vscode文件夹,此时ctrl+shift+P打开Command Palette,运行C/Cpp: Edit configurations...生成c_cpp_properties.json:
在这里插入图片描述
在这里插入图片描述

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

这样就可以在"includePath"中把我们工程中要包含的目录加进来:

"includePath": [
                "${workspaceFolder}/**",
                "xxx/include",
            ],

2. 配置编译任务(task.json)

在调试之前,首先进行编译,在vscode中是通过task机制来实现的,Ctrl+Shift+P然后输入task:
在这里插入图片描述
继续选择创建模板:
在这里插入图片描述
选择MSBuild:
在这里插入图片描述
然后直接修改为下面的

// tasks.json
{
    // https://code.visualstudio.com/docs/editor/tasks
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",  // 任务的名字叫Build,注意是大小写区分的,等会在launch中调用这个名字
            "type": "shell",  // 任务执行的是shell命令
            //就是在shell中执行(假设文件名为filename.cpp)g++ filename.cpp -o app
            "command": "g++", // 命令是g++
            "args": [
            	 "-g",
                 "'-Wall'",
                 "'-std=c++17'",  //使用c++17标准编译
                 "'*.cpp'", //要编译的文件
                 "-o", //对象名,不进行编译优化
                 "'app'",  //当前编译后输出的文件名
             ],
            "group": { 
                "kind": "build",
                "isDefault": true   //为true则直接在run task时可以进行任务选择
            },
            "problemMatcher": [
                "$gcc" // 使用gcc捕获错误
            ],
        }
    ]
}

可以Ctrl+Shift+P然后Tasks:Run task来执行一下本任务:
在这里插入图片描述
在这里插入图片描述

3. 配置调试器(launch.json)

点击左侧Debug图标,在debug中创建一个launch.json文件:
在这里插入图片描述
然后选择c++的调试器
在这里插入图片描述
现在就有了:
在这里插入图片描述

不过其中的内容非常简单:
在这里插入图片描述
此时可以点击下面这个链接,这样就跳转到官网的帮助说明中去了,其中有各个参数的详细说明和示例。(https://code.visualstudio.com/docs/cpp/launch-json-reference)
在这里插入图片描述
这里总结一个:

// launch.json

{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch", //这个应该是F1中出现的名字
            "preLaunchTask": "Build",  //在launch之前运行的任务名,这个名字一定要跟tasks.json中的任务名字大小写一致
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/app", //需要运行程序
            "stopAtEntry": true, // 选为true则会在打开控制台后停滞
            "cwd": "${workspaceFolder}", // 当前工作路径:当前文件所在的工作空间
            "environment": [],
            "externalConsole": true,  // 是否使用外部控制台,选false的话,我的vscode会出现错误
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }]
}

注意可以在“configurations”关键字中添加多个launch来调试不同的项目。

2. 方法二:使用CMake Tools插件

这个插件对于CMake工程来说使用非常简单,无需配置launch.json。
注意该插件需要首先安装C/C++插件(参考:https://code.visualstudio.com/docs/cpp/cmake-linux#_configure-hello-world)
比如建立如下demo工程:
在这里插入图片描述
CMakeLists.txt中的内容如下:

cmake_minimum_required(VERSION 3.0)
project(test_cmake)


# 添加可执行文件
add_executable(app main.cpp)

# 指定包含目录(如果需要的话)
# include_directories(path/to/include)

# 指定链接库(如果需要的话)
# target_link_libraries(ServerApp path/to/library)

#set(CMAKE_BUILD_TYPE Debug)

# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

# 如果需要设置其他编译选项,例如编译器警告
# target_compile_options(ServerApp PRIVATE -Wall -Wextra)

main.cpp:

#include <iostream>

int main(){
    std::cout << "hello" ;
    return 0;
}

首先选择Debug还是Release模型,这里有两种办法:

  • 一种办法是在CMakeLists.txt中添加set(CMAKE_BUILD_TYPE Debug)语句
  • 另一种办法是不修改CMakeLists.txt文件,点击如下图修改:
    在这里插入图片描述
    其次进行编译,点击vscode状态栏的这个图标(或者在上图CMake插件的Project Status中进行选择):
    在这里插入图片描述
    如果没有该图标,可以在状态栏右键显示:
    在这里插入图片描述
    此时需要选择Kits,我的选择是:
    在这里插入图片描述
    接着就会执行cmake,此时会在当前工程目录下创建build目录(相当于在build目录中执行cmake ..指令)

然后在main函数中加上断点,点击状态栏图标:
在这里插入图片描述
你会发现程序已经断下来了:
在这里插入图片描述

当然这里可以通过c_cpp_properties.json文件来进行目录包含。

3.方法三 C/C++ Runner插件

待补充。

4. ROS2的调试配置

注意此处的创建的.vscode文件夹在ROS工作空间下,而非src中。

4.1 使用方法一配置

三个配置文件:

//c_cpp_properties.json
{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
                "/opt/ros/humble/include",
                "/opt/ros/humble/include/rclcpp",
                "/opt/ros/humble/include/std_msgs/"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "c17",
            "cppStandard": "gnu++17",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}
// tasks.json
{
    // https://code.visualstudio.com/docs/editor/tasks
    "version": "2.0.0",
    "tasks": [
        {
            "label": "Build",  // 任务的名字叫Build,注意是大小写区分的,等会在launch中调用这个名字
            "type": "shell",  // 任务执行的是shell命令
            "command" : "colcon",
            "args": [
                "build",
                "--packages-select",
                "cpp_pubsub",
            ],
         
            "group": { 
                "kind": "build",
                "isDefault": true   
            },
            "problemMatcher": [
                "$gcc" // 使用gcc捕获错误
            ],
            "presentation": { 
            "panel": "new" //默认为“shared“表示共享,改成new之后每个进程创建新的端口
            }
        },
    ]
}
// launch.json
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "(gdb) Launch", //调试器显示对应的名称
            "preLaunchTask": "Build",  //在launch之前运行的任务名,这个名字一定要跟tasks.json中的任务名字大小写一致
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}/install/cpp_pubsub/lib/cpp_pubsub/talker", //需要运行程序
            "stopAtEntry": true, // 选为true则会在打开控制台后停滞,暂时不执行程序
            "cwd": "${workspaceFolder}", // 当前工作路径:当前文件所在的工作空间
            "environment": [],
            "externalConsole": true,  // 是否使用外部控制台
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ]
        }]
}

不过我在连接hyper-v虚拟机时Debug会卡主,于是用CMake Tools进行了配置。

4.2 使用方法二CMake Tools配置

  • 在.vscode文件夹中创建settings.json:
{
    "cmake.configureSettings": {
      "CMAKE_BUILD_TYPE": "Debug",
      
    },
    "cmake.configureOnEdit": false,
    "cmake.configureOnOpen": false,
    "cmake.sourceDirectory": "${workspaceFolder}/src/examples/rclcpp/topics/minimal_publisher",
  }

这里的cmake.sourceDirectory非常重要,对应了哪个包的CMakeLists文件,编译调试不同的包要修改这个路径!

  • 修改完路径后Ctrl+Shift+P,执行CMake:Configure指令;

  • 选择这里的Build哪个包的哪个程序,如果找不到哪个程序,则删除build文件夹,重新执行CMake:Configure指令:
    在这里插入图片描述

  • 选择要调试的包:
    在这里插入图片描述

  • 状态栏进行编译和调试:
    在这里插入图片描述

  • 生成的可执行程序在build根目录下,和使用task.json生成的路径是不一样的,调试可以用这个方法,不调试的话还是用方法一直接生成可执行程序到install目录下。

注意这里的编译并没有用colcon(还不太确定),至少解决了用launch.json调试卡主的问题。
注意这里也没使用task.json文件。

4.测试vscode环境变量

在vscode中有许多环境变量可以使用,具体环境变量到底是什么意思可以在当前的task.json的tasks关键字中添加下面这段:

		{
            "label": "Test",
            "type": "shell",
            "command":"echo '<test>' ${workspaceFolder}"
        }

可能得环境变量有:

${workspaceFolder} -当前.vscode文件夹所在的目录全路径
${workspaceFolderBasename} -.vscode文件夹所在的目录的目录名字
${file} -当前打开的文件,如果我当前打开的是tasks.json,那么此时中的 ${file} 就是表示的当前的tasks.json的绝对路径 xxx/.vscode/tasks.json
${relativeFile} - 当前打开文件的相对路径,如果我当前打开的是tasks.json,那么其相对路径.vscode/tasks.json
${relativeFileDirname} -当前打开文件相对于workspaceFolder的文件名 .vscode
${fileWorkspaceFolder} -当前打开文件的工作空间文件夹
${fileBasename} -当前打开文件的文件名,如果我当前打开的是tasks.json, tasks.json
${fileBasenameNoExtension} -当前打开的文件的没有扩展名的文件名,如果我当前打开的是tasks.json, tasks
${fileDirname} -当前打开文件的dirname,如果我当前打开的是task.json, 那么他的文件名 xxx/.vscode
${fileExtname} -当前打开文件的扩展名,如果我当前打开的是task.json, 那么他的扩展名json
${cwd} -任务运行器启动时的当前工作目录
${lineNumber} -活动文件中当前选定的行号
${selectedText} -活动文件中当前选定的文本
${execPath} -运行VS Code可执行文件的路径
${defaultBuildTask} -默认构建任务的名称
${pathSeparator} -操作系统用来分隔文件路径中的组件的字符,/ on macOS or linux,\ on Windows

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/557393.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面

js自动缩放页面,html自动缩放页面,大屏自动缩放页面,数字看板自动缩放页面,大数据看板自动缩放页面 由纯JS实现 html代码 <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-C…

论文精读--Learning Efficient Object Detection Models with Knowledge Distillation

在目标检测任务中&#xff0c;存在特殊的挑战&#xff1a; &#xff08;1&#xff09;目标检测任务标签信息量更大&#xff0c;根据标签学到的模型更为复杂&#xff0c;压缩后损失更多 &#xff08;2&#xff09;分类任务中&#xff0c;每个类别相对均衡&#xff0c;同等重要…

sql server2008触发器

sql server在Navicat工具不能插入数据 可以去写代码插入&#xff0c;代码连接sql server可以插入 或者使用sql server专门的工具 BEGINdeclare a int;declare s t_amount;select a baddebt_age_id,srate from aa_baddebt_age;INSERT INTO dade(id,name) VALUES(a,s) END1、插…

易保全网络赋强公证系统,前置预防、快速化解债权纠纷

网络赋强公证是一种创新的法律服务模式&#xff0c;为金融机构和债权人提供了一种便捷、高效的债权保障方式。既可以加大对违约方的司法震慑力&#xff0c;又能降低维权方实现债权的风险&#xff0c;且执行时间更快&#xff0c;债权周期更短&#xff0c;诉讼费用更低&#xff0…

VMware配置CentOS 7 并实现ssh连接

Vmware 17下载地址 ***永久许可证&#xff1a;***5Y012-8HL8P-0J8U0-032Q6-93KKF CentOS 7 下载地址 一、配置CentOS 如下 创建新的虚拟机&#xff0c;选择典型&#xff0c;点击下一步 选择上述下载镜像存储位置&#xff0c;选择镜像&#xff0c;点击下一步 3.填写相关信息…

云从科技AI智能体云月亮相中国铁建GSF项目展示中心

近日&#xff0c;中国铁建大湾区科学论坛永久会址项目综合展示体验中心&#xff08;以下简称“中国铁建GSF项目展示中心”&#xff09;迎来了一位特别的客服——云月数智人。云月是云从从容多模态大模型的融合承载体——AI智能体&#xff08;AI-Agent&#xff09;&#xff0c;她…

C++面向对象程序设计-北京大学-郭炜【课程笔记(七)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;七&#xff09;】 1、类型转换运算符2、自增、自减运算符的重载3、继承和派生的基本概念3.1、基本概念3.2、派生类对象的内存空间 4、继承关系和复合关系4.1、继承关系的使用4.2、复合关系的使用 5、派生类覆盖基类成员6…

NFT Insider #127:STEPN与阿迪达斯合作推出独家NFT运动鞋

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members &#xff08;https://twitter.com/WHALEMembers&#xff09;、BeepCrypto &#xff08;https://twitter.com/beep_crypto&#xff09;联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜…

C# 字面量null对于引用类型变量✓和值类型变量×

编译器让相同的字符串字面量共享堆中的同一内存位置以节约内存。 在C#中&#xff0c;字面量&#xff08;literal&#xff09;是指直接表示固定值的符号&#xff0c;比如数字、字符串或者布尔值。而关键字&#xff08;keyword&#xff09;则是由编程语言定义的具有特殊含义的标…

阿里云服务器怎么更换暴露的IP

很多客户阿里云服务器被攻击IP暴露&#xff0c;又不想迁移数据换服务器&#xff0c;其实阿里云服务器可以更换IP&#xff0c;今天就来和大家说说流程&#xff0c;云服务器创建成功后6小时内可以免费更换公网IP地址三次&#xff0c;超过6小时候就只能通过换绑弹性公网IP的方式来…

第二部分 Python提高—GUI图形用户界面编程(六)

其他组件学习 文章目录 OptionMenu 选择项Scale 移动滑块颜色选择框文件对话框简单输入对话框通用消息框ttk 子模块控件 OptionMenu 选择项 OptionMenu(选择项)用来做多选一&#xff0c;选中的项在顶部显示。显示效果如下&#xff1a; from tkinter import * root Tk();ro…

栈和队列OJ(面试高频题 - 看完包!!!拿捏)

目录 题目一&#xff1a;括号匹配问题&#xff08;来源&#xff09; 题目描述 题目思路及实现 题目二&#xff1a;用队列实现栈&#xff08;来源&#xff09; 题目描述 题目思路及实现 题目三&#xff1a;用栈实现队列&#xff08;来源&#xff09; 题目描述 题目思路及实现 …

C# 窗体应用程序 Chart控件显示实时曲线

IDE: VS2019 项目模板&#xff1a;C# windows 窗体应用(.NET Framework) 【参考】 B站上教程C#Chart控件画折线图的使用&#xff0c;关于Chart控件的属性&#xff0c;介绍得非常详细。B站上教程C#上位机Chart控件实时曲线终极讲解&#xff0c;对鼠标滚轮事件等&#xff0c;多…

数据结构初阶-二叉树

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 二叉树 树概念和结构 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限节点组成的一个具有层次关系的集合&#xff0c;把它叫做树…

在H5开发App应用程序过程中的一些常见问题

哈喽&#xff0c;大家好呀&#xff0c;淼淼又来和大家见面啦&#xff0c;H5开发是一种可以跨平台、跨设备、且可以在各种设备上运行&#xff0c;无需安装额外的应用程序。最近有许多小伙伴跟我聊到在h5开发App应用程序的过程中遇到了一些问题&#xff0c;今天我们就这些问题来做…

赫克Hurco触摸屏维修工控机显示屏G190EG01

美国赫克Hurco工控机控制器维修C5SH11 Hurco工控机电脑维修 主要适用范围是&#xff1a;石油和石油化学工业、灶矿、油田、化学工业、化纤工业、油漆工业、肥料工业、各种制造工业。石油轮和车辆、飞机、仓库、电解车间、通讯机装配车间、要求工具不生锈、抗磁的场所等。 hurc…

SQL连接查询

连接查询&#xff1a; 同时涉及多个表的查询称为连接查询。 SQL中连接查询的主要类型 (1) 交叉连接&#xff08;广义笛卡尔积&#xff09; (2) 等值连接 (3) 自身连接 (4) 内连接 (5) 外连接 1.交叉连接 使用笛卡尔积运算的连接方式 笛卡尔积运算&#xff1a;设A&#xff…

Java 的注释

文章目录 java 的注释共有三种形式单行注释多行注释文档注释文档注释的文档需要命令进行生成GBK 不可映射问题 与大多数的编程语言一样&#xff0c;Java 中的注释也不会出现在可执行程序中。 因此我们可以在源程序中根据需要添加任意多的注释&#xff0c;而不必担心可执行代码受…

LeetCode:203.移除链表元素

&#x1f3dd;1.问题描述&#xff1a; &#x1f3dd;2.实现代码&#xff1a; typedef struct ListNode ListNode; struct ListNode* removeElements(struct ListNode* head, int val) {if(headNULL)return head;ListNode *NewHead,*NewTail;ListNode *pcurhead;NewHeadNewTail…

揭秘七星创客模式:如何轻松实现财富增长

亲爱的朋友们&#xff0c;我是微三云的周丽&#xff0c;一名专注于私域电商模式创新的探索者。 在当今商业社会&#xff0c;随着科技的飞速发展和互联网的普及&#xff0c;商业模式的创新和变革成为企业发展的关键。其中&#xff0c;七星创客模式以其独特的魅力和gao效的yun营…