赞
踩
行则将至,道阻且长
2.调试是什么?有多重要?
调试的基本步骤:
Debug和Release的介绍
3.windouws环境调试介绍
调试环境的准备
调试快捷键的使用介绍
调试的时候查看程序当前信息
Bug其实原意是臭虫或者虫子的意思。
这名字,是由于早期一台巨大的电脑,历史上的第一台计算机是一台非常非常大的电脑,跟一间房子一样大。人们要进到房子里面检查计算机是否工作。有一天一位计算机科学家去值班的时候,发现计算机不工作了,于是就进到房间里面检查,发现二极管上有一只臭虫死在那里了,换掉二极管后计算机就能正常工作。当天晚上该科学家把臭虫的照片贴在了日志上。如下图:
所以在报告中,科学家用胶条贴上飞蛾,并把“bug”来表示“一个在电脑程序里的错误”,“Bug”这个说法一直沿用到今天。
这就是bug的由来,总的来说,bug就是计算机不按正常要求运作了。
下面我们看一段话:
- 所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。
一名优秀的程序员是一名出色的侦探。
每一次调试都是尝试破案的过程。
这是我这个初学者的日常,不知道有没有引起你的共鸣… ╮( ̄▽  ̄)╭
所以我们要:拒绝迷信式调试!
调试:(Debug/Debugging),是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
发现程序错误的人大部分是程序员自己。 一个产品是什么样子的,按什么按钮产生什么样的界面,都是由产品经理设计的:
产品经理按照市场需求设计产品: 由程序员按照产品的样子去上开发产品,就是敲代码
然后由测试人员照着产品的功能进行测试,就是对程序员开发好的产品进行测试,发现bug就是报给程序员,程序员对bug再进行修改。
到这里,可以发现,程序员和测试人员像是一对
“天敌”,一个要少写bug,一个要多测出bug
考核就是考察测试人员测出多少bug,考察程序员写出多少bug
Debug通常被称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试。
当我们进行调试时,选择Debug
这里以vs2019(所包含的编辑器+编译器+调试器为IDE)为例
请看下面的代码,当我们进行调试时(F10),第一次循环结束后,
可以观察到 i 和 sum 的值的变化。
Release被称为发布版本,它往往是进行了各种优化,是的程序在代码大小和运行速度上都是最优的,便于用户很好的使用
以上面的演示为例
我们来验证一下:
在这两个文件下,打开Debug文件夹:
打开Release文件:
可以发现,这两个exe文件的大小是不同的,差别比较大,所以Release文件是没有调试信息的。
F5
F9
下面来操作一下
总结:按下F5直接跳到断点处的前提是中间没有阻碍(即没有限制条件,如:要输入值,循环之间没有断点等等)。
当学到后面,写到上千行代码的时候,进行调试的时候设置断点就很有必要了,(要相信自己能写到一千行代码)
-再补充一点,可以再红色框框处的灰色地带点击鼠标,也可以设置断点
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
(我的理解是:F10会把任何东西当成一行东西来看待,不管那一行是否调用函数,就算这一行是调用函数,也不会进入函数内部)
F11
逐语句,就是每次都执行一条语句,这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)
(按F10的理解,F11就会认认真真执行每一行,也会进入函数内部)
ctrl+F5
开始执行,不调试,如果你想让程序直接运行 起来而不调试就可以直接使用。
3.3.1查看临时变量的值
1.监视窗口(监视窗口是用的非常非常非常频繁的)
按如下图所示,在调试起来后,一步一步操作,四个监视可以任选一个,然后在监视名称下面输入临时变量的值,这里以a和b为例
输入a和b的值,就能够在监视窗口见到
甚至可以在监视里面计算:
监视还可以查看数组的内容:
2.自动窗口
按如下图所示操作,可以找到自动窗口
可以看到,自动窗口是非常智能的,能够准确给出代码中的变量和其他值
3.局部变量
会加载一些在上下文中产生出来的局部变量,只展示局部变量
可以看到,类似于自动窗口,局部变量也会擅自修改局部变量,反而达不到想要观察某个局部变量的目的。
4.内存
按F10开始调试后,就能找到内存,如图:
输入arr后,可以看到其内存中存储了十个数,从右到左读取,是由于 “小端” 的原因,具体会另外一篇文章进行讲解
5.查看调用堆栈
所谓的堆栈:可以理解成一个谷仓:如下图
以求阶乘为例:
(故意写错代码,为了演示调试的强大)
int main()
{
int i = 0;
int ret = 0;
int n = 0;
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
ret *= i;
}
printf("%d", ret);
return 0;
}
具体的调试方法上面已经介绍的非常详细啦,万事需要动手,才能get到要点,看完别忘了亲自动手实践喔!
再给一个实例:
(实例2:下面代码也有错误,请改正一下) //求1!+2!+3!+...+m! int main() { int i = 0; int ret = 1; int n = 0; int sum = 0; int m = 0; scanf("%d", &m); for (n = 1; n <= m; n++) { for (i = 1; i <= n; i++) { ret *= i; } //求n的阶乘 sum += ret;//每次求完就加起来 } printf("%d", sum); return 0; }
看到这里,你已经足够强大了,剩下得就是亲自动手实践!
下课!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。