C语言(长期更新)第7讲:VS实用调试技巧

C语言(长期更新)

第7讲

VS实用调试技巧

    跟着潼心走,轻松拿捏C语言,困惑通通走,一去不回头~欢迎开始今天的学习内容,你的支持就是博主最大的动力


目录

C语言(长期更新)

第7讲

VS实用调试技巧

知识回顾

 前言

7.1 Bug

7.2 调试

7.3 F5和F9

7.4release和debug

7.5 几个常用快捷键及功能

7.6 调试案例1

7.7调试案例2

7.8 编程常见错误归类


知识回顾

今天我们来学习一些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 编程常见错误归类

  1. 编译错误——语法错误
  2. 链接错误——无法解析的外部符号LNK
  3. 运行错误——语法正确,可运行,但存在bug——调试解决

    好了今天的学习内容就到这里啦,谢谢你的陪伴,我是潼心,下次再见~如果这篇文章对你有帮助的话。请务必给主播一个一键三连,球球了,这对主播很重要~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值