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对应的要保持一致
几个比较常用的:
- ${workspaceFoler} vscode打开的文件夹路径
- ${file} 当前打开的文件路径
- ${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文件没有调试好