vscode远程连接Linux调试c++,详解launch.
在Linux下进行C/C++开发调试是必不可少的,但是由于配置比较多,在过去很长一段时间都不太清楚每个配置的具体含义。所以花了一点时间它们都搞明白。
调试C++程序
安装C/c++ Extension自不必说了
以开源项目TinyWebServer为例。
选中任意一个.cpp文件,点击右上角的添加调试配置按钮,出现四个选项
一句话总结这4个选项的区别:前三个选择不同的编译器来生成可执行文件然后再调试,(gdb)启动不生成可执行文件,直接进行调试。
具体来讲它们的区别如下:
-
C/C++: g++ 生成和调试活动文件:这个配置选项使用g++编译器来生成可执行文件,并使用默认的调试器进行调试。默认情况下,g++编译器用于编译C++代码,生成的可执行文件可以在调试过程中进行逐行调试、设置断点和观察变量等操作。
-
C/C++: cpp 生成和调试活动文件:这个配置选项使用cpp编译器(C预处理器)来对源代码进行预处理,并生成预处理后的输出文件。这个选项不会生成可执行文件,因此你无法直接进行调试。主要用于查看预处理后的代码,以便进行分析或调试前的检查。
-
C/C++: g++-11 生成和调试活动文件:这个配置选项与第一个选项类似,但使用的是g++-11编译器。g++-11是g++的一个特定版本,它可能提供了更高的C++标准支持或其他特定功能。如果你的项目需要使用g++-11编译器,你可以选择此配置选项进行编译和调试。
-
(gdb)启动:这是调试器配置选项,它使用GNU调试器(gdb)作为调试器来调试生成的可执行文件。这个选项不涉及编译器的选择,而是关注调试过程中的调试器配置。你可以设置断点、观察变量、单步执行代码等操作。
不同的选项会产生不同的配置,但总体而言都是差不多的(后面会细讲)。对于TinyWebServer这个项目而言,选择1、3、4都是可以的,如果选择4,
VS code 会在.vscode文件夹下为我们生成launch.json文件。launch就是启动的意思,它为我们设置一些启动程序的选项
launch.json文件中的内容如下:
{
"configurations": [
{
"name": "(gdb) 启动", //起个名字
"type": "cppdbg",
"request": "launch",
"program": "输入程序名称,例如 ${workspaceFolder}/a.out", //执行程序的路径,${workspaceFolder}是相对于你当前选中的文件而言
"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
}
]
}
],
"version": "2.0.0"
}
重点关注上面带注释的参数就可以了。
由于TinyWebServer自带makefile文件,我们可以手动make编译,然后再调试(待会可以通过其他方式的配置省略这一步)。修改成下面这样就可以进行调试了
{
"name": "TinyWebServer",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/server", //${fileDirname}为当前VScode选中的文件所在的目录,所以千万别选错了文件
"args": ["-p 10001"], //设置端口号为10001
"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
}
]
}
现在来看一下选择"C/C++: g++ 生成和调试活动文件"会有什么不同。
vscode会帮我们生成两个文件:launch.json
和tasks.json
launch.json多了两行
"configurations": [
{
"name": "C/C++: g++ 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/${fileBasenameNoExtension}",
"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
}
],
//相比上面的配置文件多了这两行
"preLaunchTask": "C/C++: g++ 生成活动文件", //启动之前执行的任务,这个任务放在tasks.json中
"miDebuggerPath": "/usr/bin/gdb" //DebuggerPath的位置
}
],
tasks.json中的内容
{
"tasks": [
{
"type": "cppbuild", //类型为构建cpp项目
"label": "C/C++: g++ 生成活动文件", //任务的名称
"command": "/usr/bin/g++", //编译命令
"args": [ //编译参数
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}" //程序运行路径
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "调试器生成的任务。"
}
],
"version": "2.0.0"
}
相当于在调试之前先执行一个任务(编译任务),略微修改一下:
//task.json
{
"name": "C/C++: g++ 生成和调试活动文件",
"type": "cppdbg",
"request": "launch",
"program": "${fileDirname}/server",
"args": ["-p 10001"],
"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++ 生成活动文件",
"miDebuggerPath": "/usr/bin/gdb"
}
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ 生成活动文件",
"command": "make", //启动之前执行make
"args": [],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": "build",
"detail": "调试器生成的任务。"
}
],
这样启动之前就不用手动make了。
此外如果在launch.json中直接添加配置,会出现下面四个选项:
分别讲解一下这四种调试的区别:
-
(gdb)启动:这是最常用的调试方式。在(gdb)启动模式下,VS Code会启动一个新的gdb进程,并在其中加载并调试你的程序。这意味着你可以通过设置断点、逐行执行代码以及检查变量等方式进行调试。当程序执行结束或者遇到断点时,调试会自动停止。
-
(gdb)附加:在(gdb)附加模式下,你可以附加到已经在运行的进程上进行调试。这种方式适用于你想要调试已经在后台运行的程序,或者在程序崩溃时进行调试。在这种模式下,你需要提供正在运行的进程的进程ID(PID),然后VS Code会连接到该进程的gdb实例进行调试。
-
(gdb)管道启动:在(gdb)管道启动模式下,你可以使用管道将程序的输入和输出与gdb连接起来,以实现交互式调试。这种方式适用于需要从标准输入读取数据或者与程序的输出进行交互的情况。通过使用管道,你可以在VS Code中与程序进行交互,并在需要时设置断点、观察变量等。
-
(gdb)管道附加:在(gdb)管道附加模式下,你可以附加到一个已经通过管道连接到gdb的正在运行的程序上进行调试。这种方式结合了(gdb)附加和(gdb)管道启动的特性,适用于需要在运行中的程序上进行交互式调试的情况。