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

发布于:2024-04-19 ⋅ 阅读:(26) ⋅ 点赞:(0)

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文件没有调试好