当前位置: 首页 > news >正文

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——调试解决

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

http://www.lryc.cn/news/607780.html

相关文章:

  • ADB 底层原理
  • Android 运行 deno 的新方法 (3): Termux 胖喵安初
  • 【Leetcode hot 100】49.字母异位词分组
  • [mssql] 分析SQL Server中执行效率较低的SQL语句
  • imx6ull-驱动开发篇6——Linux 设备树语法
  • 快速了解决策树
  • 四、Portainer图形化管理实战与Docker镜像原理
  • 音视频学习(四十五):声音的产生
  • 图漾相机-ROS1_SDK_ubuntu 4.X.X版本编译
  • 档案馆可视化:历史宝库的数字新貌
  • Thread 中的 run() 方法 和 start() 方法的
  • JavaScript:Ajax(异步通信技术)
  • 编译器工作原理的显微镜级拆解
  • 个人电脑部署私有化大语言模型LLM
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • 重型机械作业误伤预警响应时间缩短80%!陌讯多模态识别算法在工程现场的应用优化
  • build文件夹下面的主要配置文件
  • Day 29: 复习
  • 设计模式篇:在前端,我们如何“重构”观察者、策略和装饰器模式
  • (LeetCode 面试经典 150 题) 138. 随机链表的复制 (哈希表)
  • PyTorch 中 Tensor 统计学函数及相关概念
  • linux编译基础知识-库文件标准路径
  • 3D,对比2D孰优孰劣?
  • SEA-RAFT:更简单、更高效、更准确的RAFT架构
  • 重生之我在暑假学习微服务第八天《OpenFeign篇》
  • 【C语言】内存函数与数据在内存中的存储
  • 推荐系统学习笔记(六)自监督学习
  • Kubernetes 构建高可用、高性能 Redis 集群实战指南
  • Ubuntu系统VScode实现opencv(c++)视频及摄像头使用
  • ffmpeg命令和ffplay命令详解