1.调试是什么?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。当我程序出现了逻辑错误时就需要调试了。
2.调试的步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
3. Release 和 Debug的介绍
- Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
- Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。
例如:在VS2022中:
实例一:
#include <stdio.h> int main() { int i = 0; int arr[10] = {0}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
这段代码在debug 模式去编译,程序的结果是死循环。
如果是 release模式去编译,则没有死循环。
他们之间有什么区别呢?
【Debug】下:
通过调试操作,发现数据访问的第12个元素刚好就是 i变量所在的空间,通过修改 arr[12]将 i改成了0。就这样 i 变量一旦增加到了12就会被改成0,程序发生了死循环。
原因:程序在栈上开辟空间时,优先会利用高地址的空间,因为此处i变量先创建,所以变量i的地址高于数组的地址。随后创建数组,数组的起始内存空间肯定是在i变量的下面,当数组越界访问时,访问的地址越来越高,由于i与arr数组的最后一个元素的地址空间只差了8个字节,刚好数组向上多访问两个元素,就访问到了i变量,并且数组还做了将i变量置为0的操作,此时, arr[i]就又开始访问数组的第一个元素了,等到访问到arr[i](i==12)时,又将i置为0,一直循环往复,形成了死循环。
【release】下:
release版本之下,程序不会出现死循环。因为编译器做了一些优化处理。我们可以适当观察一下:
可以发现:变量在内存中开辟的顺序发生了变化,影响到了程序的执行结果。
4. Visual studio的调试
4.1环境准备
首先要在编译环境中选择 Debug 选项,代码才能正常调试。
4.2快捷键的使用
常用的快捷键需要记住,后期会帮我们节省很多时间。例如:shift+F11用于跳出该函数。
F5:启动调试,经常用来直接跳到下一个断点处
F9;创建断点和取消断点。断点可以在程序的任意位置设置。
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL + F5:开始执行但是不调试。
4.3 调试的时候查看程序信息
调试启动之后。
查看内存信息:
总之,调试的功能应有尽有,要根据不同的实例恰当的选取。