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文件,编译调试不同的包要修改这个路径!

  • 删除build文件夹,每次切换调试不同的包,最后都要删除一下build文件夹,关闭vscode重新进入。

  • 关闭vscode重新进入。

  • 选择这里的Build哪个包的哪个程序:
    在这里插入图片描述

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

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

  • 生成的可执行程序在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.mzph.cn/news/820134.shtml

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

相关文章

Gin框架小结

Gin 简介 Gin是一个轻量级的Web框架&#xff0c;用于构建高性能的Go语言Web应用程序。提供了路由管理、中间件支持、参数绑定和验证、错误处理、静态文件服务等功能。 Gin框架解决了什么问题和痛点 1.golang http 标准库本身提供了比较简单的路由注册能力&#xff0c;只支持…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

清明三天,用Python赚了4万?

每年4月&#xff0c;是Python圈子里接私活的旺季&#xff0c;特别是在节假日这种数据暴增的时间段&#xff0c;爬虫采集、逆向破解类的私活订单会集中爆发&#xff0c;量大价高。几乎所有的圈内人都在趁着旺季接私活。 正好&#xff0c;我昨天就做了一单爬虫逆向私活&#xff…

引领软件供应链安全 比瓴科技位居安全牛全景图第一

近日&#xff0c;安全牛第十一版《中国网络安全行业全景图》正式发布&#xff0c;比瓴科技入选全景图软件供应链安全赛道中开发流程安全管理、DevSecOps和软件成分分析三个重要细分领域&#xff0c;并位居开发流程安全管控领域第一。 安全牛本次全景图研究工作于23年正式启动&a…

什么是云安全?云安全包含哪些方面?

云计算彻底改变了数据存储的世界&#xff0c;它使企业可以远程存储数据并随时随地从任何位置访问数据。存和取变得简单&#xff0c;也使得云上数据极易造成泄露或者被篡改&#xff0c;所以云安全就显得非常重要了。那么什么是云安全&#xff1f;云安全的工作原理是什么&#xf…

做一个好的程序员难吗?只需要这10个习惯

在这个世界上&#xff0c;有数以百万计的人对软件开发充满热情&#xff0c;他们有很多名字&#xff0c;如软件工程师、程序员、编码员、开发人员。一段时间后&#xff0c;这些人可能会成为一名优秀的编码员&#xff0c;并且他们将非常熟悉如何使用计算机语言完成工作。但是&…

EasyRecovery激活秘钥2024最好用的电脑数据恢复软件下载

EasyRecovery数据恢复软件是一款专业且功能强大的数据恢复工具&#xff0c;它旨在帮助用户从各种存储设备中恢复由于各种原因&#xff08;如误删除、格式化、病毒攻击、系统崩溃等&#xff09;导致丢失的数据。这款软件支持多种存储介质&#xff0c;包括但不限于硬盘驱动器、U盘…

0.5W 3KVDC 隔离 单输出 DC/DC 电源模块 ——TPR-W5 系列

TPR-W5系列是一款需要隔离和电压转换的产品&#xff0c;工业级环境温度&#xff0c;温度范围从–40℃到105℃&#xff0c;用于PCB安装的国际标准结构。此系列产品小巧&#xff0c;效率高&#xff0c;低输出纹波及提供3000V以上的直流电压隔离&#xff0c;用于需要隔离的场合&am…

【Spring系列】- Spring事务底层原理

实验准备 配置文件 首先在配置文件中配置jdbcTemplate和事务管理器&#xff0c;并且需要开启事务的注解EnableTransactionManagement以及Configuration注解 ComponentScan("com.lyd") EnableTransactionManagement Configuration public class ApplicationConfig …

[入门]测试原则-ApiHug准备-测试篇-002

&#x1f917; ApiHug {Postman|Swagger|Api...} 快↑ 准√ 省↓ GitHub - apihug/apihug.com: All abou the Apihug apihug.com: 有爱&#xff0c;有温度&#xff0c;有质量&#xff0c;有信任ApiHug - API design Copilot - IntelliJ IDEs Plugin | Marketplace 写在前面…

低敏猫粮怎么选?看这一篇就够了!

亲爱的朋友们&#xff0c;你们是否曾经为了家中敏感肠胃的小猫咪而犯愁&#xff0c;不知道如何选择适合的猫粮呢&#xff1f;今天&#xff0c;就让我们一起聊聊低敏猫粮与普通猫粮的那些不同之处吧&#xff01;&#x1f431; 1️⃣ **成分差异**&#xff1a;首先&#xff0c;从…

Go 自定义14位时间类型 yyyyMMddHHmmss

目录 功能 代码 功能 数据库或者接口时间类型&#xff0c;经常会使用14位的时间格式。每次都转换有点麻烦。可以自定义一个时间类型。 自定义类型需要实现json接口中的MarshalJSON与UnmarshalJSON两个函数&#xff0c;这样在做json编码解码时就会自动转为14位的时间格式了。…

第四届大数据工程与教育国际会议(BDEE 2024)即将召开!

第四届大数据工程与教育国际会议&#xff08;BDEE 2024&#xff09;将于2024年8月9-11日在泰国清迈举行。数据驱动教育变革&#xff0c;智慧点亮未来课堂&#xff01;BDEE 2024是专注于大数据工程与教育领域的重要学术会议&#xff0c;全球大数据与教育精英齐聚&#xff0c;在数…

使用 Docker 部署 SurveyKing 调查问卷系统

1&#xff09;SurveyKing 介绍 SurveyKing 是一款功能强大、操作简便的开源问卷系统。它不仅满足了用户对问卷调查的基本需求&#xff0c;还提供了丰富的逻辑设置和灵活的问题设置&#xff0c;使得问卷制作更加智能化和个性化。此外&#xff0c;SurveyKing 还具有快速部署和安全…

构建鸿蒙ACE静态库

搭建开发环境 根据说明文档下载鸿蒙全部代码&#xff0c;一般采取第四种方式获取最新代码(请保证代码为最新) 源码获取Windows下载编译环境 MinGW GCC 7.3.0版本 请添加环境变量IDE 可以使用两种 CLion和Qt,CLion不带有环境需要安装MinGW才可以开发,Qt自带MinGW环境&#xff0…

认识一下RAG

1.RAG技术背景与挑战 2.RAG的核心概念 3.RAG的工作流程与架构 4.RAG的优化方法 RAG的提出 •Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks是一篇重要的论文(2020年5月) •REALM: Retrieval-Augmented Language Model Pre-Training (2020)就将BERT预训练模…

家居网购项目(三)

文章目录 1.后台管理—添加家居1.需求分析2.程序框架图3.修改FurnDao添加方法add 4.修改FurnDaoImpl添加方法add 5.单元测试FurnDaoTest.java 6.修改FurnService添加方法add 7.修改FurnServiceImpl添加方法add 8.单元测试FurnServiceTest.java 9.修改furn_add.jsp10.修改FurnSe…

【面试经典 150 | 数学】阶乘后的零

文章目录 写在前面Tag题目来源题目解读解题思路方法一&#xff1a;数学优化计算 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结…

人工智能——机器学习概述

1. 人工智能 1.1. 概念 人工智能(Artificial Intelligence&#xff0c;AI)&#xff0c;是新一轮科技革命和产业变革的重要驱动力量&#xff0c; [26]是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 人工智能是智能学科重要的组…

【Ansible自动化运维】Ansible入门基础信息【安装配置、常用命令与模块】

介绍安装配置注意事项yum安装验证安装配置host配置主机清单配置主控端被控端 常用模块命令组成command模块shell模块copy模块script模块 日志信息最后 介绍 Ansible 是一个开源 IT 自动化引擎&#xff0c;可自动执行供应、配置管理、应用程序部署、编排和许多其他 IT 流程。它可…