第一步:安装vscode编辑器
预先安装:
- vscode(https://code.visualstudio.com/)
- 在vscode中安装 C/C++ extension for VS Code(在左侧扩展栏中搜索 “C++”)
第二步:安装MinGW-w64工具链
MinGW 提供最新的GCC本地builds、MinGW-w64、其他C++工具和库。也可在 msys的github 处直接下载。
MSYS2需要在 Windows8.1及以上的操作系统运行。
其他注意事项请看:vscode官网
安装完成后,将 MinGW-w64 的 bin 文件夹路径(D:\CodingTools\CandCpp\MinGW64\bin)添加到Windows的 PATH 环境变量中。
最后在 cmd 中输入以下内容,如果有输出信息,表示安装成功。
gcc --version
g++ --version
gdb --version
- 请认准核对添加的path变量与 bin 目录的位置是否一致。
- gcc 有输出但 gdb 没有,需要从 MinGW-w64 toolset 中安装丢失的包。如编译过程中提示:“The value of miDebuggerPath is invalid.”说明丢失了
mingw-w64-gdb
package
第三步:建立helloworld.cpp
通过 cmd 进入某一个文件夹下,此目录存放源文件目录。在 cmd 输入:
# 在当前目录下打开vscode
code .
如果有提示,选中 “Yes, I trust the authors”(只要是自己创建的文件夹)
后续在vscode的当前文件夹下,看到一个文件夹 .vscode
,包含以下三个文件:
- tasks.json:build 指令
- launch.json:debug 设置
- c_cpp_properties.json:编译器路径和智能提示设置
添加源文件
ps:关于 vscode 编辑器的一些接口和布局;另外可以通过 tab 键选择智能提示的某些成员。
运行cpp后缀文件
-
打开helloworld.cpp使得该文件是 active file
-
点击右上角:Run C/C++ File
-
从检测到的系统中的编译器中,选择:C/C++: g++.exe build and debug active file (只会在第一次编译运行此cpp文件时选择编译器)(cpp和g++的区别?)
-
终端显示有以下信息,运行成功
关于tasks.json
第一次运行程序,c++扩展会在.vscode
文件夹下创建一个task.json
文件(其实该文件是保存在关于 build 的配置中,?)
下面是一个例子:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++.exe build active file", // 此值会在任务列表中看到(tasks list ?),可以取任意值
"command": "D:\\CodingTools\\CandCpp\\MinGW64\\bin\\g++.exe",
// 1. command:明确要运行的程序是使用g++编译器
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}\\${fileBasenameNoExtension}.exe"
],
/*
args数组:传递给g++的命令行参数
第一个参数-fdiagnostics-color=always:对诊断信息使用颜色(一直),具体看gcc manuals
-g:生成调式信息({file}:当前在vscode中打开的文件)
-o:生成目标文件(win是exe后缀)
${fileDirname}:{file}所在的文件夹
${fileBasenameNoExtension}:{file},不包括后缀
*/
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger." // 任务列表中的任务的详细描述,推荐重命名这个值,从而区分相似任务
}
],
"version": "2.0.0"
}
关于task.json中变量的含义:https://code.visualstudio.com/docs/editor/variables-reference
play按钮会从task.json
读取信息,从而知道如何编译运行程序。可以在task文件中定义多个编译任务,无论哪个任务被标记为默认任务,都会使用play按钮。
如果需要更改更改默认编译器,在命令版(Command Palette)中运行 Tasks: Configure Default Build Task (?)。或者可以更改task.json
文件,移除默认配置,并且用:
"group": "build",
替换默认配置中的下列部分:
"group": {
"kind": "build",
"isDefault": true
},
编译多cpp文件
使用参数"${workspaceFolder}/*.cpp"
代替 ${file}
。
也可以更改输出文件的名称:使用硬编码方式的文件名"${fileDirname}\\${fileBasenameNoExtension}.exe"
替换为"${workspaceFolder}\\myProgram.exe"
Debug helloworld.cpp
-
返回helloworld.cpp使其成为一个活跃文件
-
在鼠标某一行左侧边缘,或者在当前行按 F9 设置断点
-
右上角的下拉按钮中点击 Debug C/C++ File
编辑器在对断点debug前,会高亮断点行;鼠标选中debug控制器左侧的原点,可拖动debug控制器的位置。
debug
1. 单步调试
1、设置好断点后,点击debug。点击debug控制器的第二个选项:Step Over(F10),结果如下图。此时会执行for循环中的第一行,跳过关于vector、string等需要被调用的类的内部函数,此时看左侧msg变量被创建和初始化。
2、再次按下Step Over(F10)
3、可以继续按下Step Over知道循环结束(C++ extension 2019.3 以后的版本,不会输出任何信息到Debug Console直到循环退出)。如果希望更深入地debug源代码中关于C++ standard library,可以按下Step Into(F11):
返回helloword.cpp源代码:
- 一直Step Over
- 在for循环内部的cout附近插入断点,再按F5(Continue),就重新回到了for循环的cout语句。(此时如果按一次F5,terminal会显示一个vector中的单词)
4、debug结束后,终端会显示输出,也包含由GDB输出的诊断信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QxAw1FI-1690797412575)(C:\Users\w\AppData\Roaming\Typora\typora-user-images\image-20230728212854134.png)]
2. 设置监视器(set a watch)
如果在debug时想观察一个变量的值,可以设置一个watch(监视)
-
现在循环中插入断点。点击左侧watch栏的加号,输入“word”(即循环变量的名称)。现在可以观察word中的值。
-
增加另一个watch:在循环前增加此语句:int i = 0; 然后在循环中增加语句: i++; 在watch栏增加对变量i的watch。
-
在debug过程中,如果想快速查看任何变量的值,可以将鼠标指针悬停在该变量上。
通过修改launch.json进行自定义debug
用play按钮或者F5debug时,C++扩展会动态创建debug配置。有时需要自定义debug配置(比如,需要在运行时指定一些参数传递给程序),可以在launch.json文件中自定义debug配置信息。
选择第一个,创建一个launch.json文件。然后在下拉列表中选择GDB。
然后点击右下角的Add configuration:
以上几步的过程和vscode官方文档的教程不太一样,没有选取g++编译器的debug的过程。
最后launch.json中的内容:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Launch",
"type": "cppdbg",
"request": "launch",
"program": "enter program name, for example ${workspaceFolder}/a.exe", // 想要debug的程序
// 官方文档的设置为:"${fileDirname}\\${fileBasenameNoExtension}.exe", 即活跃文件夹下后缀为exe的活跃文件
"args": [], // 此属性是要传递给程序的参数数组
"stopAtEntry": false, // 默认情况下C++扩展不会增加任何断点在程序中,stopAtEntry为false
"cwd": "${fileDirname}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "/path/to/gdb",
// gdb.exe的位置,如"C:\\msys64\\mingw64\\bin\\gdb.exe"
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
配置好launch.json后,当需要对程序debug,play按钮和f5会读取此文件信息。
其他关于C/C++的设置
如果想要更多关于 C/C++扩展的控制,可以创建一个文件: c_cpp_properties.json。在此文件中可以修改一些设置,如编译器路径、include路径、C++标准(默认是C++17)以及其他。步骤:
-
Ctrl+Shift+P 打开命令版,输入“C/C++”,选中C/C++: Edit Configurations (UI)。这将会打开 C/C++配置页面,如果对此页面有任何改动,VS Code会将改动写入 .vscode文件夹下的 c_cpp_properties.json文件中。
-
查看配置文件页面和json文件内容:
includePath:程序包含的头文件不在你的工作区或标准库路径,添加其路径到此数组中。
compilerPath:C++标准库头文件路径。关于此参数的查找顺序:
- 首先查找MSVC编译器;
- 查找windows中是否存在子系统linux的g++;
- MinGW-w64 的g++;
如果已经安装过WSL(Windows Subsystem for Linux,第2步)或 Visual Studio ,则需要修改 compilerPath 参数。
参考来源:
- VS Code官方文档