本文参考【笔记】用VSCode调试C++代码的方法
并在此基础上修改一部分。
1、必要的插件
安装插件:C/C++,其作用是提供对接gdb的接口
2、配置.vscode
1 生成.vscode文件
1、打开源代码main.cpp,按 F5 ,然后选择第一项 C++ (GDB/LLDB)(图片来自参考)
2、然后选择 C/C++: g++.exe 生成和调试活动文件…(图片来自参考)
3、由于代码是分成多个文件,所以vscode不能直接处理,此时会报错(如果源文件只有一个main.cpp,那么这里就不会报错)。现在选择 打开"launch.json" ,并仍然选择 C++ (GDB/LLDB) ,你会发现生成了 .vscode ,并且这个文件夹下面有 launch.json 和 tasks.json 两个文件
2 配置 tasks.json
打开 tasks.json,将 “args”: [ … ] 中的 " f i l e " , 注释掉,并在下面添加一行 ∗ ∗ " {file}", 注释掉,并在下面添加一行 **" file",注释掉,并在下面添加一行∗∗"{workspaceFolder}//*.cpp",表示编译的文件是源文件main.cpp所在文件夹下的所有.cpp文件
然后注意一下这个 “label” 标签的值 “C/C++: g++.exe 生成活动文件” ,它是编译源文件这个任务的名称,下一步会用到。
另外也可以看看下面的的两个参数 “-o”, 和 “{fileDirname}\{fileBasenameNoExtension}.exe” ,这表示编译生成的可执行文件的名字,生成的位置在工作空间的build文件夹下。因此将 “{fileDirname}\{fileBasenameNoExtension}.exe"改为”${workspaceFolder}/build/ExtendedKF",目的是指明可调试的可执行程序的位置。
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
//"${file}",
"${workspaceFolder}/**/*.cpp",//这一点是关键
"-o",
//"${fileDirname}/${fileBasenameNoExtension}"
"${workspaceFolder}/build/ExtendedKF"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
3 配置 launch.json
打开 launch.json ,点击右下角的 添加配置 ,选择 C/C++: (gdb) 启动 。
在生成的代码中添加一行 “preLaunchTask”: “C/C++: g++.exe 生成活动文件”, ,这就是2中 tasks.json 那个 “label” 的值,“preLaunchTask” 代表预启动的任务,表示每次调试或运行之前就会先对源文件进行编译。
另外,你也可以选择不添加 “preLaunchTask”: “C/C++: g++.exe 生成活动文件”, ,这样的话,就需要运行程序前先对程序进行编译,编译的快捷键是 ctrl+shift+B ,然后才能 ctrl+F5 运行或 F5 调试。
在 launch.json 中,“program” 标签需要的参数是可执行文件的路径。在3.2中我们提到生成可执行文件的位置在工作空间的build文件夹下。因此,这里的 “program” 的值改为 “${workspaceFolder}/build/ExtendedKF”
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/ExtendedKF",
"args": [
"/home/liu/tracking-with-Extended-Kalman-Filter/data/sample-laser-radar-measurement-data-1.txt",
"/home/liu/tracking-with-Extended-Kalman-Filter/output/output.txt"
],
"stopAtEntry": false,
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "将反汇编风格设置为 Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++ 生成活动文件"
}
]
}
aunch.json 中的 “args”: [] 标签代表传递给程序的命令行参数,如果main()函数需要命令行参数,可以在这里添加。如上图所示,给main()函数传递了三个参数,分别为 “/home/liu/tracking-with-Extended-Kalman-Filter/data/sample-laser-radar-measurement-data-1.txt”,
“/home/liu/tracking-with-Extended-Kalman-Filter/output/output.txt”
至此,返回main.cpp,设置断点,F5就可以愉快地(bushi)调试代码了