vscode调试文件(C++,ROS和cmake文件)

VsCode调试文件

参考文档:

code.visualstudio.com/docs/editor/variables-reference

code.visualstudio.com/docs/editor/tasks

主要修改task.json下的"args"、launch.json中的"program",“args”

注意task.json中的label以及launch.json中的preLaunchTask对应的要保持一致

几个比较常用的:

  1. ${workspaceFoler} vscode打开的文件夹路径
  2. ${file} 当前打开的文件路径
  3. ${fileDirname} 当前打开的文件的路径(不包括文件名)

首先,注意一点:

g++进行调试时需要先运行一遍,再开启调试模式,就可以正常进行了

tasks.json文件:

这里的type可以是cppbuild,也可以是shell,是shell的话要按照cmake的规则配置

{
    "version": "2.0.0",
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++-9 生成活动文件",
            "command": "/usr/bin/g++-9",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${workspaceFolder}/src/*.cpp",
                "-I",
                "${workspaceFolder}/include",
                "-o",
                "${workspaceFolder}/build/debug_test"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "调试器生成的任务。"
        }
        
    ]
    
}

shell版本(cmake版本):

{
    "version": "2.0.0",
    //这里相当于是cd build文件夹
    "options":{
        "cwd":"${workspaceFolder}/build"
    },
    "tasks": [
        //执行cmake ..命令
        {
            "type": "shell",
            "label":"cmake",
            "command":"cmake",
            "args":[
                ".."
            ]
        },
        //执行make命令
        {
            "label":"make",
            "group":{
                "kind":"build",
                "isDefault":true
            },
            "command":"make",
            "args":[
                
            ]
        },
        //这个label做了两件事cmake .. make
        {
            "label":"Build",
            "dependsOrder":"sequence", //按列出的顺序执行任务依赖项
            "dependsOn":[
                "cmake",
                "make"
            ]
        }
    ]
    
}

launch.json文件:(原始)

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": []
}

launch.json文件:(现在)

这个设置同样适用于cppbuild的task.json文件和shell版本的cmake task.json文案金

重要的几个设置:"program"和"preLaunchTask"这两个参数很重要

{
    "version":"0.2.0",
    "configurations":[
        {
        	"name":"g++-8 - 生成可调试活动文件",
            "type":"cppdbg",
            "request":"launch",
            "program":"${workspaceFolder}/build/debug_test", //这里的debug_test是可执行文件,是需要提前编译好放在这个目录下的,如果没有这个可执行文件,会报错,需要通过g++ src/function.cpp src/main.cpp -Iinclude -o build/debug_test这个命令生成可执行文件
            "args":["hello_debug!"],
            "stopAtEntry":false,
            "cwd":"${workspaceFolder}",
            "environment":[],
            "externalConsole":false,
            "MIMode":"gdb",
            //下面这些还没研究明白是干啥的,还不能用
            /*"setupComands":[
                {
                    "description":"为gdb启动整齐打印",
                    "text":"-enable-pretty-printing",
                    "ignoreFailures":true
                }
            ]
            */
            //下面的preLaunchTask参数要么是Build,要么是cppbuild,与上面的tasks.json中的type参数保持一致
            "preLaunchTask":"Build",
            "miDebuggerPath":"/usr/bin/gdb"
    	}
    ]
}

CMakeLists.txt文件的简写

cmake_minimum_required(VERSION 3.0)

project(HELLOWORLD)

# 指定include目录
include_directories(${CMAKE_SOURCE_DIR}/include)

# 指定编写文件所需要的C++的一些参数
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O2 -Wall")

# 生成可以被调试的可执行文件
set(CMAKE_BUILD_TYPE Debug)


# 指定要执行
add_executable(helloWorld_cmake helloWorld.cpp)


文件目录:

请添加图片描述

f5:调试模式

f10:单步越过,下一步

f11:单步进入

C++文件调试

/usr/bin/c++   -I/usr/include/eigen3  -O3 -g   -o CMakeFiles/eigenMatrix.dir/eigenMatrix /home/gzc/slamBook/slambook2/ch3/src/useEigen/eigenMat
rix.cpp 

-I 后面跟include的目录

-O3 是进行代码优化

-g 表示的是生成可以进行gdb调试信息的可执行文件

-o 后面跟要生成的可执行文件

-c 只编译不链接(需要去掉)

ros调试

不用vscode的ros调试

先初始化功能包:

mkdir -p ~/catkin_ws/src	创建一个子目录src,上一级目录是工作空间名称'catkin_ws'
cd ~/catkin_ws/				进入创建的工作空间目录
catkin_make					对创建的工作空间进行编译
cd ~/catkin_ws/src								重新打开终端,可以使用此命令进入src目录
cd src											已经位于工作空间目录,可以使用此命令进入src目录
catkin_create_pkg test01 std_msgs rospy roscpp	创建一个名为test01的新功能包

调试已有的cpp文件配上cmakelists.txt时:

catkin_make --directory 跟上自己的目录(eg:home/gzc/catkin_ws) -DCMAKE_BUILD_TYPE=Debug

这里不需要xml文件,但是使用ros创建新的功能包时需要xml文件

用vscode调试ros

安装好ros插件以后,进行调试的时候,在.vscode中一共就两个文件分别是c_cpp_properties.json和settings.json文件:

同时,要初始化时下面的输出正常,才可以创建功能包,eg:

请添加图片描述

并且需要从0开始搭建ros项目才能用,catkin_make本质上还是使用了cmake指令,只不过是将shell脚本封装起来而已,直接用catkin_make eg:

catkin_make --directory 跟上自己的目录(eg:home/gzc/catkin_ws) -DCMAKE_BUILD_TYPE=Debug

c_cpp_properties.json

{
  "configurations": [
    {
      "browse": {
        "databaseFilename": "${default}",
        "limitSymbolsToIncludedHeaders": false
      },
      "includePath": [
        "/opt/ros/noetic/include/**",
        "/usr/include/**"
      ],
      "name": "ROS",
      "intelliSenseMode": "gcc-x64",
      "compilerPath": "/usr/bin/gcc",
      "cStandard": "gnu11",
      "cppStandard": "c++14"
    }
  ],
  "version": 4
}

settings.json

{
    // 这里的配置非常关键,配置的是cmake中看哪个cmakelist.txt文件
    "cmake.sourceDirectory": "/home/gzc/fastlioQN_ws/src",
    //下面这两个是为了使用ctrl+shift+b的时候有弹窗,可以选择catkin_make的选项使用的
    "python.autoComplete.extraPaths": [
        "/home/gzc/.local/lib/python3.8/site-packages",
        "/home/gzc/livox_driver_ws/devel/lib/python3/dist-packages",
        "/opt/ros/noetic/lib/python3/dist-packages"
    ],
    "python.analysis.extraPaths": [
        "/home/gzc/.local/lib/python3.8/site-packages",
        "/home/gzc/livox_driver_ws/devel/lib/python3/dist-packages",
        "/opt/ros/noetic/lib/python3/dist-packages"
    ]
}

tasks.json

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "catkin_make",
			"args": [
				"--directory",
				"这里写工作空间的目录,即src的上一层目录",
				"-DCMAKE_BUILD_TYPE=Debug"
			],
			"problemMatcher": [
				"$catkin-gcc"
			],
			"group": "build",
			"label": "catkin_make: build"
		}
	]
}

子工程的cmakelist.txt文件

来自高博的ch3目录下:

cmake_minimum_required(VERSION 2.8)
project(chapter3)

set(CMAKE_CXX_FLAGS "-std=c++11")

# 加入各子工程
add_subdirectory(useEigen)
add_subdirectory(useGeometry)
add_subdirectory(visualizeGeometry)
add_subdirectory(examples)

gdb调试

  • GDB(GNU Debugger)是一个用来调试C/C++程序的功能强大的调试器,是Linux系统开发C/C++最常用的调试器
  • 程序员可以使用GDB来跟踪程序中的错误,从而减少程序员的工作量。
  • Linux 开发C/C++ 一定要熟悉 GDB
  • VSCode是通过调用GDB调试器来实现C/C++的调试工作的;

调试gdb实战教程:https://www.bilibili.com/video/BV1fy4y1b7TC?p=11&vd_source=ecf9c592d76c9ec37dd88ab19f5eb828

g++ -g a.cpp -o a_yes_g

生成的a_yes_g,是可以进行调试的

## 以下命令后括号内为命令的简化使用,比如run(r),直接输入命令 r 就代表命令run
$(gdb)help(h)        # 查看命令帮助,具体命令查询在gdb中输入help + 命令 

$(gdb)run(r)         # 重新开始运行文件(run-text:加载文本文件,run-bin:加载二进制文件)

$(gdb)start          # 单步执行,运行程序,停在第一行执行语句

$(gdb)list(l)        # 查看原代码(list-n,从第n行开始查看代码。list+ 函数名:查看具体函数)

$(gdb)set            # 设置变量的值

$(gdb)next(n)        # 单步调试(逐过程,函数直接执行)

$(gdb)step(s)        # 单步调试(逐语句:跳入自定义函数内部执行)

$(gdb)backtrace(bt)  # 查看函数的调用的栈帧和层级关系

$(gdb)frame(f)       # 切换函数的栈帧

$(gdb)info(i)        # 查看函数内部局部变量的数值

$(gdb)finish         # 结束当前函数,返回到函数调用点

$(gdb)continue(c)    # 继续运行

$(gdb)print(p)       # 打印值及地址

$(gdb)quit(q)        # 退出gdb

$(gdb)break+num(b)                 # 在第num行设置断点

$(gdb)info breakpoints             # 查看当前设置的所有断点

$(gdb)delete breakpoints num(d)    # 删除第num个断点

$(gdb)display                      # 追踪查看具体变量值

$(gdb)undisplay                    # 取消追踪观察变量

$(gdb)watch                        # 被设置观察点的变量发生修改时,打印显示

$(gdb)i watch                      # 显示观察点

$(gdb)enable breakpoints           # 启用断点

$(gdb)disable breakpoints          # 禁用断点

$(gdb)x                            # 查看内存x/20xw 显示20个单元,16进制,4字节每单元

$(gdb)run argv[1] argv[2]          # 调试时命令行传参

$(gdb)set follow-fork-mode child   # Makefile项目管理:选择跟踪父子进程(fork()

一些bug

请添加图片描述

这个是launch.json文件没有调试好

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

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

相关文章

OpenCV 学习笔记2 C++

1.图像直方图 直方图(Histogram)是图像处理中常用的工具,它表示图像中每个像素强度值的分布情况。在OpenCV中,可以使用 cv::calcHist 函数来计算图像的直方图。 图像直方图是一种展示图像像素强度分布的统计图表。它显示了图像中…

市场份额第一!博睿数据持续领跑中国APM市场

近日,全球领先的IT市场研究和咨询公司IDC发布《中国IT统一运维软件产品市场跟踪报告,2023H2》。报告显示,2023下半年博睿数据以 17.6%的市场份额蝉联 APM(应用性能监控)市场第一。2023年全年博睿数据以18.8%的市场份额持续领跑中国APM市场。 …

实现联系人前后端界面,实现分页查询04.15

实现联系人前后端界面,实现分页查询项目包-CSDN博客 项目结构 数据库中建立两个表: 完整的后端目录 建立联系人People表,分组Type表,实现对应实体类 根据需求在mapper中写对应的sql语句 查询所有,删除,添…

网工交换基础——Access、Trunk、Hybrid处理VLAN的过程

一、VLAN帧格式: 通过Tag区分不同VLAN。打tag/剥离tag都有交换机接口进行。 1.接收方向:不会进行tag的剥离/弹出(永远不会剥离VLAN Tag)。 2.交换机内部:处理的都是带Tag的数据帧。 交换机开机,默认生成树…

振弦式土压力计性能评估指南

振弦式土压力计是一种常用的岩土工程监测仪器,主要用于测量土体中各点的土压力变化。在长期的监测过程中,保持土压力计的性能稳定与准确至关重要。因此,定期检查和确定振弦式土压力计的性能是否正常成为了一项必要的工作。本文将详细介绍如何…

PHP-extract变量覆盖

[题目信息]: 题目名称题目难度PHP-extract变量覆盖1 [题目考点]: 变量覆盖指的是用我们自定义的参数值替换程序原有的变量值,一般变量覆盖漏洞需要结合程序的其它功能来实现完整的攻击。 经常导致变量覆盖漏洞场景有:$$&#x…

【智能算法】花朵授粉算法(FPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2012年,Yang等人受到自然界花朵授粉过程启发,提出了鸭群算法(Flower Pollination Algorithm, FPA)。 2.算法原理 2.1算法思想 FPA基于自然界花朵授…

Git 指令

一.常见命令 1.1 初始化仓库 #初始化仓库 git init #查看隐藏文件 ll -a #查看隐藏文件.git结构 tree .git/1.2 创建/删除用户信息 #创建用户信息 git config user.email "151859163.com" git config user.name "zsl" #查看 git config -l #删除用户信息…

水电预付费远程管理

1.概述:水电预付费远程管理的定义与重要性 水电预付费远程管理系统是一种先进的能源管理模式,它允许用户在使用水电资源前预先支付费用,并通过远程技术进行实时监控和管理。这种系统不仅提高了效率,减少了欠费风险,也…

【缓存常见问题】

在使用缓存时特别是在高并发场景下会遇到很多问题,常用的问题有缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题。 1、缓存穿透 首先,什么是缓存穿透呢? 缓存穿透是指请求一个不存在的数据,缓存层和数据库层都没有这个数据&…

VTK 动画:利用 Qt 的时间控制

VTK 动画:利用 Qt 的时间控制 VTK 动画:利用 Qt 的时间控制VS2022 QT6.2.3 VTK9.3.0 环境配置Qt 定时器类 QTimer实现运行结果参考 VTK 动画:利用 Qt 的时间控制 第一篇文章 《VTK 动画:框架、流程与实现》 讲到了 VTK 的动画框…

小行星碰撞

题目链接 小行星碰撞 题目描述 注意点 两个小行星相互碰撞,较小的小行星会爆炸如果两颗小行星大小相同,则两颗小行星都会爆炸每一颗小行星以相同的速度移动正负表示小行星的移动方向(正表示向右移动,负表示向左移动&#xff09…

超净实验室用耐强酸碱耐高温PFA酸缸进口透明聚四氟塑料方槽

PFA清洗槽是四氟清洗桶后的升级款,主要用于半导体光伏光电等行业,一体成型,无需担心漏液,表面光滑无毛刺。 别名PFA浸泡桶、PFA酸缸、PFA方槽等,可定制尺寸,可配套盖子,盖子有PFA/PTFE两种材质…

如何寻找可靠的第三方软件检测机构

随着科技的飞速发展和数字化进程的加速,软件质量成为了企业竞争的关键。为了确保软件的质量和性能,许多企业选择寻找第三方的软件检测机构来进行软件的质量控制和评估。那么,如何找到一家可靠的第三方软件检测机构呢? 1.明确检测…

前段css中border-radius的简单使用

前段css中border-radius的使用 一、前言二、border-radius语法三、border-radius的模型例子1.源码12.源码1效果截图 四、border-radius的动画效果(动态交互)1.源码22.源码2显示效果 五、结语六、定位日期 一、前言 在CSS中,我们常用border-r…

AUS Global 与皇家贝蒂斯俱乐部在对战皇家马德里的比赛日举办现场体验活动

AUS Global 最近前往西班牙庆祝与皇家贝蒂斯的赞助合作,并获得了难忘的比赛日体验,包括在贵宾室中观看皇家贝蒂斯对阵皇家马德里的精彩比赛。 活动开始时,AUS Global 受邀来到皇家贝蒂斯主场贝尼托-比利亚马林体育场的独家 Showbox 贵宾室。…

微信小程序的支付功能,纯前端步骤,超级详细

1、首先在微信开放平台,申请移动应用并开通支付功能,申请应用后可以获取 AppID 和 AppSecret 值 2、在前端项目中的配置参数中打开支付功能 步骤:项目的根目录下有个manifest.json文件,打开并在左侧目录找到APP SDK配置&#xf…

AI实景无人直播自动卖卷系统,开创了实体商家直播自运营先河。

AI实景无人直播自动卖卷系统,开创了实体商家直播自运营先河。 从当下这一刻起,拒绝内耗,做行动的巨人。因为,命运不会偏袒任何人,却会眷顾一直朝着光亮前进的人。 《人民日报》 随着新媒体的快速发展,很…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置,然后标记起来对应left,如果只有一个零,只需要left后面的数中有>1的数就能跳过去,如果是00&a…

Jmeter 接口造10w条用户数据

1、将mysql-connector-java-5.1.22-bin.jar放到D:\apache-jmeter-5.5\lib\ext目录下 2、在测试计划中,添加mysql-connector-java-5.1.22-bin.jar包路径 3、添加-线程组-添加-配置元件-jdbc connection configuration 4、配置jdbc连接参数 设置变量名称:…
最新文章