当前环境
测试所用环境为wsl2+vscode
前言
首先我们得知道怎么在shell中启动调试
- 在编译源文件时设置
g++ -g
选项,或者是在cmake中设置set(CMAKE_BUILD_TYPE Debug)
,才能开启调试 - 启动gdb,然后在gdb中启动包含调试信息的程序
(gdb)./a.out
;也可以在gdb中调试已经启动的进程:如果进程的pid是1145,则(gdb) attach 1145
- 然后就可以在开始调试了
配置launch.json
在vscode调试也就是通过配置launch.json完成上述过程。相当于一种批处理程序。
- 生成launch.json文件。
点击左上角的运行选项—添加配置—选择c++(GDB/LLDB)
启动
如configurations
为空再重复一遍,可生成如下的文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
//需修改
"program": "输入程序名称,例如 ${workspaceFolder}/a.out",
"args": [],
"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
}
]
}
]
}
- 修改json文件配置。
- 将鼠标停在左边的文件名上即可知道左边选项的含义
- 需要将上述
program
对应的内容改为编译生成的可执行文件的路径 - 可能需要添加
"miDebuggerPath": "/usr/bin/gdb"
- 解释上述配置
- 如果你的gdb程序不在环境变量中,你需要配置
"miDebuggerPath": "/usr/bin/gdb"
告诉vscode你的调试器的路径 - 上述红色部分的内容是告诉vscode包含调试信息的可执行程序在哪(也就是它的路径),在我的项目中的路径为
"program": "${workspaceFolder}/build/test/disk_scheduler_test"
其中${workspaceFolder}为在 VS Code 中打开的文件夹的路径,下图所示 - 其他的重要选项
request
可将调试模式改为附加,即调试一个运行中的进程program
调试文件的路径,在Windows下可表示为mingw32-make.exe
args
启动可调试文件可带才命令行参数stopAtEntry
程序入口是否停止cwd
目标工作目录environment
添加到程序环境的环境变量externalConsole
是否启动控制台MIMode
选择gdb调试或者lldbmiDebuggerPath
调试器的路径
F5一键调试–配置tasks.json
现在我们配置好launch.json后,可以F5一键启动调试,但如果修改了源文件之后,就得重新编译。
为了解决这个问题,就得配置tasks.json.
- 首先我们的在
launch.json
文件中添加配置"preLaunchTask": "Build"
,红字Build是一个标签,依赖于后面的tasks.json
中的lable
。这样我们在按下F5调试后就会去先去执行依赖的Build任务 ctrl + shift + p
输入configuring task
,选择默认模版。或者直接在创建.vscode/tasks.json
文件- 写出下列代码
{
"version": "2.0.0",
"tasks": [
{
//红色部分代表我们需要改动的部分
//选择在哪一个目录中执行这个命令
"options": {
"cwd": "${workspaceFolder}/build"
},
//这个目录的标签,与launch.json中preLaunchTask所对应
"label": "Build",
//执行的命令
"command": "make",
//给命令传递的参数
"args": [
"disk_scheduler_test"
]
},
]
}
- 解释上述task.json文件。用cmake构建工程后会生成makefile文件,在makefile文件所在的build/文件夹中执行
make disk_scheduler_test
就重新编译了我们所改动的文件。解释见上代码块 - 如果你需要执行多个命令,可以将tasks.json改为如下形式。以下表示在
build
目录下,先执行cmake ..
再执行make
命令
{
"version": "2.0.0",
//表示tasks数组中的任务都在这个目录中执行
"options": {
"cwd": "${workspaceFolder}/build/"
},
"tasks": [
{
"label": "cmake",
"command": "cmake",
"args": [
".."
]
},
{
"label": "make files",
"command": "make",
"args":[
]
},
{
//与launch.json关联的lable
"label":"Build",
//当前命令的执行依赖与下面的所有lable
//类似于launch.json中的preLaunchTask
"dependsOn":[
"cmake",
"make files"
]
}
]
}