当前位置: 首页 > 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.xdnf.cn/news/1228195.html

相关文章:

  • 仿真电路:(十七下)DC-DC升压压电路原理简单仿真
  • 【DL学习笔记】计算图与自动求导
  • 鸿蒙智选携手IAM进驻长隆熊猫村,为国宝打造智慧健康呼吸新空间
  • [硬件电路-120]:模拟电路 - 信号处理电路 - 在信息系统众多不同的场景,“高速”的含义是不尽相同的。
  • C语言字符函数和字符串函数全解析:从使用到模拟实现
  • [硬件电路-115]:模拟电路 - 信号处理电路 - 功能放大器工作分类、工作原理、常见芯片
  • 深入 Go 底层原理(十一):Go 的反射(Reflection)机制
  • stm32是如何实现电源控制的?
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频摘要生成与智能检索优化进阶(377)
  • QT中使用OpenCV保姆级教程
  • 搜索与图论(最小生成树 二分图)
  • MyBatisPlus之核心注解与配置
  • Docker 部署与配置 MySQL 5.7
  • 位运算-371.两整数之和-力扣(LeetCode)
  • 解决 InputStream 只能读取一次问题
  • 【多模态】DPO学习笔记
  • [创业之路-528]:技术成熟度曲线如何指导创业与投资?
  • Python爬虫实战:研究mahotas库,构建图像获取及处理系统
  • 【DeepSeek-R1 】分词系统架构解析
  • 社群团购市场选择与开源技术赋能下的下沉市场开拓策略研究——以开源AI智能名片、链动2+1模式与S2B2C商城小程序为例
  • LLM Prompt与开源模型资源(3)如何写一个好的 Prompt
  • 【论文笔记】Multi-Behavior Graph Neural Networks for Recommender System
  • “神威·太湖之光”:科技创新引擎与国家算力基石的崛起之路
  • jenkins从入门到精通-P1—九五小庞
  • 机器学习 —— 决策树
  • 【Linux网络】netstat 的 -anptu 各个参数各自表示什么意思?
  • 波士顿咨询校招面试轮次及应对策略解析
  • 个人电脑部署私有化大语言模型LLM
  • 操作系统-lecture5(线程)
  • Flutter镜像替换