目录
一、什么是bug?
bug本意是“昆虫”或“虫子”,现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞
二、什么是调试?
调试是当程序已经存在问题的时候,去找问题的过程;调试是一个动作
三、Debug 和 Release
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序;
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用
对比可以看【到从同一段代码中编译生成的可执行文件的大小】,Release版本明显要小,而Debug版本明显大
四、VS调试快捷键
(一)F9:创建断点和取消断点
断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节
注:
条件断点:满足这个条件,才触发断点;
在循环中可以对断点【右键】→【条件设置循环条件】
(二)F5:启动调试
经常用来直接跳到下一个断点处,一般是和F9配合使用
注:
F5是让程序执行到【运行逻辑】的下一个断点,并不是【物理逻辑】的下一个断点
(三)F10:逐过程
通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
注:
F10调试会有一行行地跳过,如果一行是函数,不会进入看函数的细节,直接完成调用;
需要按下F10才能进入单步执行模式,在单步执行模式下,调试器会逐行执行代码,并在监视窗口中显示变量的值、表达式的结果等信息;简单来说,【按下F10开始调试代码】
(四)F11:逐语句
每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部;
注:
F11调试是每一条代码都查看,在函数调用的地方,想进入函数观察细节,必须使用F11;
如果使用F10,直接完成函数调用,调试下一条语句
(五)CTRL + F5:开始执行
如果你想让程序直接运行起来而不调试就可以直接使用。
注:
Ctrl + F5 是运行程序,和断点无关;
直接 F5 是开始调试,跳到下一个断点处
(六)一些注意点
【F9和F5组合】是快速到达想要查看的地方;
【F10和F11组合】是细致的观察
五、监视和内存观察
(一)监视
开始调试后,在菜单栏中【调试】->【窗口】->【监视】,打开任意一个监视窗口,输入想要观察的对象就行
注:
调试箭头指到的语句是没有执行的;
函数传参传的是数组时,想要在监视中观察函数中的数组,要在监视窗口中输入【数组名,元素个数】才可以监视到;
在调试窗口中,只要给一个合法的表达式,都可以得到运行结果:
(二)内存
如果监视窗口看的不够仔细,也是可以观察变量在内存中的存储情况,还是在【调试】->【窗口】->【内存】
在内存窗口中观察数据:
内存中数据的16进制的展示的理解:
① 由于使用2进制展示数字会太长,故电脑用16进制展示;
② 1个16进制位对应4个2进制位,8个2进制位等于1个字节;所以展示4列时,两两16进制位等于1个字节,4列就4个字节,大小等于整型 int 的内存大小(1个2进制位等于1个比特位);
③ 每个字节都有自己的地址:
(三)其他窗口
自动窗口:编译器自动给你观察变量,会随着程序的进行变量自动出现和消失,使用起来不方便;
局部变量窗口也类似,此外还有反汇编窗口,寄存器窗口等
六、调试的实践
在【vs2022;x86;Debug】的环境下调试以下代码:
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
代码运行时发现时死循环,调试时使用内存窗口发现 i 的地址和 arr[12]的地址一样,内存布局如下:
栈区上的内存使用习惯是:先使用高地址,再使用低地址 → 先 i ,后 arr;
另外,数组随着下标的增长,地址是由低到高变化的 → arr[0] 在下面,arr[9] 在上面
疑问:为什么 i 和 arr 数组之间恰好空出来2个整型的空间
答:纯属巧合,在 i 和 arr 中间空出大空间,完全取决于编译器的实现,比如在vc6.0中,这个代码的 i 和 arr 之间没有空隙;gcc中空一个 int 位
注:
栈区的默认的使用习惯是先使用高地址,再使用低地址的空间,但是这个具体还是要编译器的实现,比如:在VS上切换到X64,这个使用的顺序就是相反的,在Release版本的程序中,这个使用的顺序也是相反的
七、编程常见错误归类
(一)编译型错误
写代码时的语法错误
(二)链接型错误
错误提示:无法解析的xxx;
原因是用了xxx,但是xxx不存在
(三)运行时错误
能正常运行,但结果错误,需要靠调试处理
以上博客仅供分享,若有错误,请多多指正,共同进步