目录
引言:
什么是bug
什么是调试
Debug和Release
Debug
Release
VS调试快捷键
监视和内存观察
拓展
调试举例
变成常见错误归类
编译型错误
链接型错误
运行时错误
拓展
结语
引言:
那么,经过先前几篇知识点的讲解以及一些小游戏的制作,你们在写完代码时,肯定会出现一些问题,那么遇到问题时,我们应该怎么用更快更便捷的方式去找到并解决程序的问题呢,那么,这一片,我要讲的便是VS的实用调试技巧,看完肯定对你调试代码有所帮助
那么,接下来便进入正文——————>
什么是bug
那么,在开始讲调试前,我们先来讲一讲一些专业术语,首先,我们进行调试是为了找到代码中的问题,代码中隐藏未解决的问题便是bug
什么是调试
那么,知道bug这一知识点后,我们就要讲调试了
什么是调试呢,找bug的这个过程就是调试,英文即(Debug)消灭bug
注:调试程序时,首先要承认代码出现了问题,然后通过各种手段定位问题的位置,不要想着什么明明和某某的代码一样,为什么他对了我错了,肯定不是代码问题这种思想不要出现
Debug和Release
讲完最基本的bug和调试之后,我们来讲一下Debug和Release
Debug
在 VS上编写代码时,就能看到Debug和Release,如图,这就是俩个版本,后面跟的x86,x64这种是环境,如图
Debug通常称为调试版本,它包含调试信息,并且不会做任何优化,便于程序员调试程序
在Debug底下生成的程序,我们称这个可执行程序为debug版本,他是放在Debug中的,里边包含调试信息,如图
程序员在写代码的时候,需要经常性的调试代码,就设置为Debug模式,这样编译产生的是debug版本的可执行程序,其中包含调试信息,是可以直接调试的
Release
Release称为发布版本
这个版本是用户使用的,无需包含调试信息等
它往往是进行了各种优化(编译器会自动优化),使得程序在代码大小和运行速度上都是最优的,以便用户很好的使用,通过同样代码在不同版本下生成的exe文件的内存对比便可很明显的比对出来,如图
Debug版本下所占内存
Release版本下所占内存
当程序员写完代码,测试再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为release,编译产生的就是release版本的可执行程序
注:在公司里软件测试人员是测试release版本(因为测试人员是从用户的角度去看的)
VS调试快捷键
那么,程序如果出问题了,我们怎么调试代码呢
这种时候,我们首先要进行环境准备,其实就是把版本设置成Debug版本,因为如上所述,只有dubug版本才能调试代码,接下来,我们 来讲一下常用的调试快捷键
调试快捷键
F9 ·创建断点和取消断点
断点就是这个红点,如图
断点的作用时可以在程序的任意位置设置断点,打上断点就可以使得程序到断点的位置后暂停执行
接下来我们就可以使用F10,F11这些快捷键,观察代码一步步执行的细节
附加: 条件断点 就是满足一个条件才触发断点
如何设置:右击断点,选择条件,然后添加条件后回车确定即可 ,如图
F5 启动调试,经常用来直接跳到下一个断点处,一般适合F9配合使用,然后跳到断点处后再按F10或F11就可以快捷很多,省去了前面一步步的调试
F5是按照执行逻辑来到下一个的断点,而不是物理上的断点,比如一个循环里有断点,F5跳转到断点会在循环里的断点里跳很多次
注:运行程序时不要按F5,F5不是用来运行程序的,是用来调试的(跳到下一个断点的) 如果是直接运行就按Ctrl+F5,这才是运行 因为一个断点没有设置,才导致代码一路往下走到底,但有的版本的编译器会一闪而过直接结束了
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,也可以是一条语句
F11:逐语句,就是每次都都只执行一条语句,这个快捷键可以让我们得执行逻辑进入函数内部,在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,就会直接调用函数
Ctrl+F5 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用
Ctrl+F7 只编译,不运行
Shift+F5 调试到一半强制终止调试
监视和内存观察
那么学会了调试,那我们就要在调试期间去看我们想要看的一些变量的数据变化和地址,那么怎么看呢,很简单,只需要先开始调试,然后开始调试后:调试->窗口->(监视,内存)即可,
然后再在监视或内存里面输入想要查看的变量名或地址,如图
监视就不多说了,很简单,想看变量就输入变量名,想看地址就输入变量的地址
那么我们来讲一下内存,里面分布是这样的,那个内存的二进制表示代表内存中的数据本来是二进制表示,但在这里显示十六进制
除此之外,在调试窗口中还有:自动窗口(随着调试的往下进行,会自动添加与不展示相关信息),局部变量(会自动加当前环境中的局部变量),反汇编,寄存器等窗口,自行验证使用即可
那么,到此,一般技巧应该都学会了,那么,我们来一点拓展
拓展
若是数组作为形参,想看这个数组只需要 数组名,长度 即可查看,否则直接 数组名 的话,只会显示一个数组里最高行的第一行的数组部分的元素
这句话怎么理解呢,很简单,我们结合图片和代码调试来看,如图,若不是形参的数组,只需要写数组名就可以显示所有元素,但当数组是形参时候,直接写数组名只会显示数组的最高航的第一行元素(因为这里是以维,所以只显示一个元素)这个时候我们只需要 数组名,长度,即可查看该数组到那个长度的元素
调试举例
那么,我们知道了调试后,就要去运用调试,比如下方代码,该代码要在Debug版本X86环境下才可以实现,在这个环境中,你们觉得这个代码会输出什么呢,可能有的人会觉得是直接报错,也有人觉得是输出13个hehe,其实都不是,而是死循环输出hehe,你们可以自己调试一下
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
那么为什么会死循环输出hehe呢,这时候你干看着肯定想不出什么,所以这时候我们就可以调试i和arr[i]以及arr[12],这时候,我们会发现arr[12]和 i 是同步变化的,那么这是为什么呢,难道是地址一样,这时候我们继续再监视里放入这俩个的取地址,会发现俩个的地址竟然一模一样,所以才会导致程序死循环,那么为什么会死循环呢,如图
在x86环境下刚好空俩个数据类型的字节,使得溢出的数组的第三个刚好与前一个变量地址重合,使得他们会同时更改,以至于导致死循环
这种情况在不调试的情况下肯定是不会发现的,这也正是调试的重要性
出现问题时,要调试来处理问题
注:栈区的默认的使用习惯是先使用高地址,再使用低地址的空间,但是这个具体还是要编译器的实现,比如:在VS上切换到x64,这个使用的顺序就是相反的,在release版本的程序中,这个使用的顺序也是相反的(因为Release版本编译器会自行进行优化)
变成常见错误归类
编译型错误
一般是语法错误,双击错误信息也能初步的跳转到代码错误的地方或附近,编译错误会随着语言的熟练掌握会越来越少。也越容易解决
编译如果出错了一般都是语法错误
链接型错误
一般在错误信息中看到无法解析的XXX,一般都是链接错误,不是头文件漏了也错了,就是 引用的函数写错了
链接型错误编译时不会发现错误,也无法通过报错来定位,但是无法进行调试
运行时错误
这是最难解决的错误,调试只能解决运行时错误,因为其余俩个错误都调试不起来
如果遇到运行时错误,你觉得你的思路还可以,很清晰,就尽量通过调试来寻找错误,若是自己也感觉自己写代码时候的逻辑迷迷糊糊的,删掉重打也不失为一种方法
拓展
在我们打代码的时候,一般按回车是到下一行,但是如果按Ctrl+回车的话就可以在该行的上一行空出一行进行编写,如图
按Ctrl+回车前
按Ctrl+回车后
结语
那么,这期就讲解到这里啦,接下来要准备ACM省赛了,要隔断时间再进行更新,希望这篇文章对你有所帮助,谢谢观看,感觉可以可以分享给朋友一起来学习哦