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

news2024/11/24 5:59:09

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统分析师】系统测试与维护

文章目录 1、测试方法2、测试阶段3、面向对象的测试4、测试自动化5、软件调试6、软件评审7、软件改进过程8、软件开发环境与工具9、系统转换计划10、系统的运行与维护11、系统审计 1、测试方法 例题 2、测试阶段 注意区分:每个阶段都做了什么事情3、面向对象的测试 4、测试自动…

设计模式之模板方法模式详解(下)

3&#xff09;钩子方法的使用 1.概述 钩子方法的引入使得子类可以控制父类的行为。 2.结构图 3.代码实现 将公共方法和框架代码放在抽象父类中 abstract class DataViewer {//抽象方法&#xff1a;获取数据public abstract void GetData();//具体方法&#xff1a;转换数据…

【传输层】

文章目录 传输层传输服务和协议传输层 vs. 网络层Internet传输层协议多路复用/解复用在发送方主机多路复用在接收方主机多路解复用 多路解复用工作原理无连接&#xff08;UDP&#xff09;多路解复用无连接传输&#xff1a;UDPUDP&#xff1a;用户数据报协议UDP校验和 传输层 目…

华为服务Fellow、首席项目管理专家,华为H5M项目管理标准制定主导者孙虎受邀为PMO大会演讲嘉宾

全国PMO专业人士年度盛会 华为服务Fellow、首席项目管理专家&#xff0c;华为H5M项目管理标准制定主导者孙虎先生受邀为PMO评论主办的2024第十三届中国PMO大会演讲嘉宾&#xff0c;演讲议题为“落地项目管理标准&#xff0c;打赢班长的战争”。大会将于5月25-26日在北京举办&am…

excel中vlookup查找值必须在table_array的第一列,有其他办法吗有XLOOKUP

vlookup查找值必须在table_array的第一列&#xff0c;有其他办法吗&#xff1f;有XLOOKUP。 vlookup 查找如下&#xff0c;查找值必须在table_array的第一列 如果下面&#xff0c;编码和名称交换位置&#xff0c;就不能使用vlookup查找了。 XLOOKUP 查找如下

电脑桌面便签软件哪个好?好用的电脑桌面便签

电脑作为我们日常工作的重要工具&#xff0c;承载着大量的任务和项目。当工作任务繁重时&#xff0c;如何在电脑桌面上高效管理这些任务就显得尤为重要。这时&#xff0c;选择一款优秀的桌面便签软件&#xff0c;无疑会给我们带来极大的便利。 一款好的桌面便签软件&#xff0…

注意力机制基本思想(一)

​&#x1f308; 个人主页&#xff1a;十二月的猫-CSDN博客&#x1f525; 系列专栏&#xff1a; &#x1f3c0;《深度学习基础知识》 相关专栏&#xff1a; ⚽《机器学习基础知识》 &#x1f3d0;《机器学习项目实战》 &#x1f94e;《深度学习项目实战…

2024年华中杯B题论文发布+数据预处理问题一代码免费分享

【腾讯文档】2024年华中杯B题资料汇总 https://docs.qq.com/doc/DSExMdnNsamxCVUJt 行车轨迹估计交通信号灯周期问题 摘要 在城市化迅速发展的今天&#xff0c;交通管理和优化已成为关键的城市运营问题之一。本文将基于题目给出的数据&#xff0c;对行车轨迹估计交通信号灯…

记录Python链接mysql的数据库的2种操作方式

一、使用pymysql库方式 import pymysqldb pymysql.connect(hostlocalhost,userroot,password123456) #创建链接&#xff0c;在3.8以后好像已经不支持这个种链接方式了&#xff0c; #db pymysql.connect(localhost,root,123456) cursor db.cursor()#拿到游标这样我们就拿到了…

Rust 语言 GUI 用户界面框架汇总(持续更新)

拜登&#xff1a;“一切非 Rust 项目均为非法”&#x1f60e; 什么是 GUI 图形用户界面&#xff08;Graphical User Interface&#xff0c;简称 GUI&#xff0c;又称图形用户接口&#xff09;是指采用图形方式显示的计算机操作用户界面。 现在的应用开发&#xff0c;是既要功…

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

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

设计模式系列:适配器模式

简介 适配器模式&#xff08;Adapter Pattern&#xff09;又称为变压器模式&#xff0c;它是一种结构型设计模式。适配器模式的目的是将一个类的接口转换成客户端所期望的另一种接口&#xff0c;从而使原本因接口不匹配而不能一起工作的两个类能够一起工作。 适配器模式有两种…

免费的浏览器翻译插件——easypubmed

支持谷歌和edge浏览器&#xff0c;应用商店直接检索安装就可。 非常方便&#xff0c;无论是打算文字还是查单词&#xff0c;只要选中按D&#xff0c;就可以一键翻译啦。 最重要是免费&#xff0c;而且添加了小牛翻译引擎哦。 当然了&#xff0c;此插件本身是给医学生准备的。Pu…

深度学习--CNN应用--VGG16网络和ResNet18网络

前言 我们在学习这两个网络时&#xff0c;应先了解CNN网络的相关知识 深度学习--CNN卷积神经网络&#xff08;附图&#xff09;-CSDN博客 这篇博客能够帮我们更好的理解VGG16和RetNet18 1.VGG16 1.1 VGG简介 VGG论文网址&#xff1a;VGG论文 大家有兴趣的可以去研读一下…

JAVA面向对象(下 )(一、继承和方法重写)

一、继承 1.1 什么是继承 生活中继承是指&#xff1a; 继承财产>延续财产 继承/遗传 父母的长相&#xff0c;基因 > 延续上一代的基因 继承技能、专业、职位 >延续 继承中华民族的传统文化 > 延续 青出于蓝而胜于蓝 或 长江后浪推前浪&#xff0c;前浪被拍在…

es安装中文分词器

下载地址&#xff0c;尽量选择和自己本地es差不多的版本 https://github.com/infinilabs/analysis-ik/releases 下载好&#xff0c;解压&#xff0c;把里面的文件放到es的plugins/ik目录下 把plugin-descriptor.properties文件里的es版本改成自己对应的 再启动es&#xff0c;能…

十、OOP面向对象程序设计(五)

1、什么是接口以及接口的运用 1)接口定义 Java接口(Interface),是一些列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能。) 2)接口定义的一般形式 修饰符:…

抖音小店怎么选品?这些超级容易爆单的选品方法,很少有人告诉你!

哈喽~我是电商月月 抖音小店的运营过程中&#xff0c;选品是非常重要的&#xff0c;好的商品不用宣传&#xff0c;就有人看 今天我就来给大家分享几个选品技巧&#xff0c;学会后商品一上架就有流量&#xff01; 利用数据选品 1.“蝉妈妈”的数据排行榜选品 “蝉妈妈”能看…

在Ubuntu中如何查看NASM -f选项支持的输出格式

2024年4月19日&#xff0c;周五下午 用下面这条指令就可以了&#xff1a; nasm -hf

v1.9.2-httpsok快速申请免费SSL证书

v1.9.2-&#x1f525;httpsok快速申请免费SSL证书 介绍 httpsok 是一个便捷的 HTTPS 证书自动续签工具&#xff0c;专为 Nginx 、OpenResty 服务器设计。已服务众多中小企业&#xff0c;稳定、安全、可靠。 一行命令&#xff0c;一分钟轻松搞定SSL证书自动续期 更新日志 V1…