C语言(长期更新)
第7讲
VS实用调试技巧
跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力。
目录
知识回顾
今天我们来学习一些VS实用的调试技巧的内容,坐稳了,我们发车,gogogo!
前言
在写代码的过程中,我们常常可能出现各种各样的错误和问题。今天我们就讲一些关于这些的内容
7.1 Bug
很多年以前,在一次大型计算机整机运行时设备突然停止了运转,研究人员爬上去发现有一只飞蛾,在一组寄存器之间的触点上引发了高压触电,被电死了。这才引发了故障。电脑专家格蕾丝·赫柏(Grace Murrey Hopper)将这只虫子夹进了工作日志中,并以Bug(虫子的英文名)命名这次故障。这也就有了我们后来说的这里有Bug存在(在电脑程序中隐藏的、未被发现的,问题,漏洞)
7.2 调试
我们在先前的学习中,有时会用F10进行调试,对学习的内容做一个辅助说明。在实际写代码的过程中,我们使用调试也可以找到报错,出bug的原因。
按下F10开始调试后,我们打开监视的窗口,添加要监视的变量,就可以进行bug的查找。
可以打开多个悬停的监视窗口
F11可以进入函数内部
7.3 F5和F9
在使用VS的过程中,我们会用到几个快捷键
下面我们就来详细介绍一下
- F5 开始调试
- Ctrl+F5 开始执行不调试
这俩有啥区别呢
这就涉及到另一个F9 断点 了
断点F9经常会与F5开始调试配合使用,其作用是在调试的过程中暂停在某一步
原本按F5,程序的调试会直接进行,不会中断。这个过程极为迅速,不利于观察
添加断点,再运行F5时,就会在断点处中断,方便我们检查某一可能出现问他的地方
再次按下F5,箭头(代表调试进程)会跳到下一个断点
可以看到,按下F9添加断点后,再次按下F5,这次就没有直接全部执行完,而是左端的箭头停在了第一个断点的位置。
再次按下F5,我们会发现,它依旧停在了第11行的位置
奇了怪了,不是说会停在下一个断点的位置吗?
这里的下一个断点指的是执行逻辑上的下一个断点。由于循环的存在,需要按10次F5才能调到第13行的断点。
结合具体的例子,我们大致明白了F5和F9是如何配合使用的了。这也就是F5和Ctrl+F5的区别所在。Ctrl+F5是执行不调试,自然也就不会有断点这一说。
7.4release和debug
我们注意到,在上面VS界面的截图中,有Debug和Release两个选项
我们在运行代码后就会在代码保存的位置发现一个叫Debug的文件夹
与之对应,选择Release就会在同样位置出现叫Release的文件夹
它们的区别在哪里捏?
1.Debug
Debug是可调试的,方便程序员修改、调试代码,是未经优化的。
debug在英文中的意思是消除bug,de这个前缀有delete删去的含义。
2.Release
Release是供用户使用,为保障运行速度,经过优化后的版本,不可调试。
我们的测试人员就会针对这个版本进行测试,提升用户体验。
如果我们分别生成两个文件就会发现Debug文件夹的大小要不Release要大,这就是包含调试信息的缘故。
7.5 几个常用快捷键及功能
VS快捷键使用技巧(超全)_vs自动缩进快捷键 csdn-CSDN博客
内存也是很常见的
7.6 调试案例1
逻辑漏洞出现在哪里呢?
通过调试我们发现,由于j在每次内循环时没有复位(即每次开始循环是并不都是从1开始,先前的值依旧在j中存储),导致出现了BUG
如果我们不能直接发现这个隐藏的逻辑漏洞,调试就可以帮助我们更加迅速的找到问题所在、
在写代码的过程中我们一定要注意
1.保持头脑的清醒
2.你要知道你的想要什么效果
3.在调试的过程中,观察代码是不是按照你的需要(想法)在执行。
4.如果你发现代码并没有按照你的想法在走,这里就是bug了
除此之外,我们上面的代码还可以进行优化
既然每次阶乘前面都是一样的,也就是说j不用每次从1开始加,在先前基础上再乘以n就行啦
7.7调试案例2
与环境相关的bug
我们会发现在VS2022 Debug x86的环境配置下,会无限循环打印hehe
我们能判断到可能的错误是
非法访问内存导致的越界
我们通过调试可以发现
在监视窗口中arr[12]的值竟和 i 的值同步变化,而我们输入地址发现两者地址竟也相同。
这是怎么回事捏?
我们知道内存分为栈区,堆区,静态区
arr[10]和 i 都是局部变量,局部变储存在栈区中
内存的存储一般是由高地址到低地址的
然而数组中元素的存放却是从低到高按顺序存放的
在VS2022 Debug x86 的运行环境下,i和arr[9]的距离只有2个整型的空间,所以当arr[12]要按顺序存放时恰好占据了i的位置,因此当它置为0时,i也随之变为0了,这就造成了死循环
调试过程中,要做到心中有数,也就是程序员自己心里要清晰的知道希望代码怎么执行,然后再去看代码有没有按照我们预定的路线在执行。
调试是需要反复去动手练习的,调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能力,就能看到本质,就像能给程序做B超一样,对程序内部一览无余。
程序员的三种境界:
1.看代码就是代码 一字母,函数,
2.看代码不是代码 一内存,逻辑,本质 调试是必须掌握的(必要条件)
3.看代码还是代码
7.8 编程常见错误归类
- 编译错误——语法错误
- 链接错误——无法解析的外部符号LNK
- 运行错误——语法正确,可运行,但存在bug——调试解决
好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~