说明:
该篇内容主要讲解 vscode 调试的原理以及调试的方法
主要内容是对下面链接文章的解读:
VS Code之C/C++程序的调试(Debug)功能简介 - 知乎
引入:
首先先介绍一下 vscode 的代码编译执行过程(注意:编译和执行是两个过程)
**编译:**vscode通过调用本机配置的代码编译器(g++.exe)程序读入用户所编写的代码,输出目标程序文件
**执行:**执行上述生成的目标程序文件
实例:
在编写完vscode代码后,可以在终端输入:
-
进行代码编译
// xxx.cpp 是你所编写的代码的名称 g++ xxx.cpp
-
进行代码程序运行
./a.exe (一般默认生成的是a.exe)
上述操作的过程简单描述起来就是:编译代码直接得出编程的结果
无法通过观察中间的代码执行过程来检验代码的逻辑思路是否出现错误,只能通过肉眼查错以及塞入大量的 printf 来进行过程变量的查询
在这时候就需要用到代码编辑器自身所带的 “调试”功能基于代码来辅助编程人员进行代码逻辑的检验
调试原理:
Vs Code 相较于 VS 麻烦的就是,Vs Code C/C++ 调试功能需要在指定目录(.vscode)下配置.json文件来实现 C/C++ 调试器的调用,而不像VS可以直接插入断点(这个后面会介绍)在点击两下就能进行调试的开始
配置文件简介:(简略看看一下)
VS Code的配置文件一般是指特定目录下的JSON文件。所谓JSON是一种文本格式,用于轻量化地存储一组
{键: 值}
信息,诸如编译器的路径、调试器的路径和有关选项等。很多工作在进行前,VS Code都要从指定的配置文件中读取有关配置,以确定具体的工作内容和相关参数,编译任务和调试任务皆是如此,也包括整个编辑器的字体字号、主题颜色的配置,分别储存在不同的JSON文件中。 同一项配置可能在多个文件中出现,比如一个字体大小的配置,可能同时出现在当前工作区的配置中、当前用户的个人配置中、软件的全局默认配置中。它们的优先级由高到低,也就是说,前面的特定配置只要出现就会覆盖后面的同一配置。这样分层设计的好处是,全局默认配置可以被保护起来,防止用户乱改一通导致软件不能用了;不同的用户可以为自己做个性化的配置,与其他用户互不干扰;用户也可以为自己的多个工作区做不同配置,以满足不同工作的需要。
Vs Code 的调试功能实现主要需要对以下两个.json文件进行配置
task.json
(编译任务)launch.json
(调试任务)
主要是对launch.json
调试任务的配置,运用到task.json
文件主要是因为vscode的调试实现的逻辑是:在编译一遍代码的基础上来进行调试
以下是两个文件的具体内容信息,并写有注释,可依据自己的需求以及文件路径位置进行修改
**Tips:**可以直接的复制但需要修改一些配置信息,也可以按照链接中博主的操作来进行自动生成,由于篇幅过长就不多赘述了哈
-
task.json
:{ "version": "2.0.0", "tasks": [ { "type": "shell", "label": "C/C++: gcc.exe build active file", /* 编译任务名称 */ "command":"D:\\mingw64\\bin\\g++.exe", /* C++ 编译器路径 */ "args": [ /* 编译器执行参数 */ "-g", "${file}", "-o", /* 指定输出文件的名称 */ "${fileDirname}\\build\\${fileBasenameNoExtension}.exe", /* 生成exe可执行文件,在前加上文件夹路径可对执行文件进行收纳*/ "-fexec-charset=GBK", /* 设置执行字符集为GBK,防止中文乱码 */ "-I", "E:\\desktop\\VS_Code\\C ++", /* 设置头文件路径 */ "-std=c++17" /* 指定C++版本 */ ], "options": { "cwd": "D:\\mingw64\\bin", /* 设置命令工作目录 */ }, "problemMatcher": [ "$gcc" ], "group": "build", } ] }
-
launch.json
:{ "version": "0.2.0", "configurations": [ { "name": "g++.exe build and debug active file", /* 调试任务名称,启动调试时会在待选列表中显示 */ "type": "cppdbg", "request": "launch", "program": "${fileDirname}\\build\\${fileBasenameNoExtension}.exe", /*收纳exe可执行文件*/ "args": [], "stopAtEntry": false, /* 是否在程序入口处停止 */ "cwd": "${workspaceFolder}", "environment": [], "externalConsole": true, /* 是否启动外部控制台(独立终端)运行程序,默认false表示在集成终端中运行程序 */ "MIMode": "gdb", "miDebuggerPath": "D:\\mingw64\\bin\\gdb.exe", /* 调试器路径*/ "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true } ], "preLaunchTask": "C/C++: gcc.exe build active file" /* 调试会话开始前预执行任务,一般为编译程序(在调试前先将程序编译一遍),与tasks.json中的label相对应 */ } ] }
调试功能使用:
基础断点使用:
-
**断点:**全名叫做“中断点”,用户可以通过在程序代码中的特定位置设定断点,在调试程序的过程中,当程序执行到这个位置时,执行就会停止。此时,用户就可以进行程序的状态,变量的值的检查以及控制程序的执行
-
断点的设定方式:
-
调试执行:
快捷键: F5(或者点击vscode工具栏:运行 - 启动调试 )
调试过程:
- 程序经过自动编译并启动调试后,将运行至第一个断点暂停。
点击“单步跳过”按钮,执行一行代码
再点击“单步跳过”,此时执行scanf()
这行代码。注意这时程序将因为scanf()中断(与断点无关),需用户输入完指定内容才能继续。
继续单步跳过,将再次观测到n的值发生改变
不单步了,直接点击第一个“继续”按钮运行到下个断点(没有断点就到程序结束),看到最后的输出结果。
进阶使用方法:
参考链接,里面也讲述的很详细了,就不多赘述了嘿嘿: