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.pswp.cn/diannao/94119.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CONTRASTIVE-KAN:一种用于稀缺标记数据的网络安全半监督入侵检测框架

研究背景与挑战​ ​工业环境需求​: 第四次工业革命中,物联网(IoT)和工业物联网(IIoT)的普及使网络安全成为关键挑战。 入侵检测系统需实时性高,尤其对关键基础设施(如燃气管道)的快速攻击检测至关重要。 ​核心问题​: ​标签数据稀缺​:工业系统多数时间处于正常…

综合:单臂路由+三层交换技术+telnet配置+DHCP

技术考核1 实验拓扑:实验需求 1.按照图示配置IP地址设备名 2.在SW1和SW2之间配置链路聚合增加链路带宽,提高可靠性 3.PC5和PC6属于VLAN10, PC7和PC8属于VLAN20 4.SW1和SW2属于二层交换机,SW3为三层交换机(VLAN100用于对…

工业火焰识别漏报率↓78%!陌讯多模态融合算法实战解析

原创声明:本文技术方案解析基于陌讯技术白皮书2025版 标签:#陌讯视觉算法 #火焰识别优化 #工业安全监控 #边缘计算优化一、行业痛点:工业火灾监控的漏检危机据《2025工业安全白皮书》统计,化工场景传统火焰识别系统漏报率高达35%&…

C++引用:高效安全的别名机制详解

目录 一、引用的概念 二、引用的特性 1、定义时必须初始化 2、一个变量可以有多个引用 3、引用一旦绑定实体就不能更改 三、const引用(常引用) 1、const引用的基本特性 2、临时对象与const引用 3、临时对象的特性 4、const 引用作为函数形参 …

大语言模型API付费?

下面是目前主流 大语言模型 API 的付费情况总览: 🧠 一、主要大语言模型 API:是否付费对比 提供方模型是否免费限制 / 说明OpenAIGPT-3.5 / GPT-4 / GPT-4o❌ 付费为主有免费额度(如 ChatGPT 免费版),API …

巧用Wisdom SSH:容器化运维与传统运维的抉择

巧用Wisdom SSH:容器化运维与传统运维的抉择 在当下的技术领域,容器化运维与传统运维是运维人员面临的两大主要方向,对于从业者来说,如何抉择至关重要,而Wisdom SSH在其中能发挥显著作用。 传统运维:基石…

API征服者:Python抓取星链卫星实时轨迹

API征服者:Python抓取星链卫星实时轨迹从基础调用到工业级卫星追踪系统实战指南一、太空数据时代:星链卫星的全球覆盖​​星链卫星网络规模​​:已发射卫星数量:4,000目标卫星总数:42,000轨道高度:340km - …

《深潜React列表渲染:调和算法与虚拟DOM Diff的优化深解》

当用户在内容平台无限滑动,或是在管理系统中处理成百上千条数据时,每一次无卡顿的交互,都是调和算法与虚拟DOM Diff机制协同工作的成果。理解这两者的底层逻辑,不仅是性能优化的钥匙,更是从“使用框架”到“理解框架”…

自动化与配置管理工具 ——Ansible

一、Ansible 概述1.1 核心特性Ansible 是一款开源的自动化运维工具,采用无代理(Agentless)架构,通过 SSH 协议实现对远程节点的管理。其核心特性包括:无代理架构:被管理节点无需安装代理软件,降…

Effective C++ 条款18:让接口容易被正确使用,不易被误用

Effective C 条款18:让接口容易被正确使用,不易被误用核心思想:设计接口时,应使正确使用方式直观自然,同时通过类型系统、行为约束等手段主动预防常见错误,减少用户犯错的可能性。 ⚠️ 1. 接口误用的常见陷…

nodejs读写文件

1.读文件 node有很多模块,可在node模块查看相应模块; var fsrequire(fs)fs.readFile(./src/a.doc,utf8,function(err,data){// 如果发生错误,data是undefined 如果成功 err为null console.log(err); console.log(data); }) 2.写文件 var…

ConcurrentHashMapRedis实现二级缓存

1. 为什么使用ConcurrentHashMap?在Java中,ConcurrentHashMap 是一个线程安全且高效的哈希表实现,广泛用于高并发场景。将其用作一级缓存的原因主要包括以下几点:1.1. 线程安全性ConcurrentHashMap 是线程安全的,支持多…

Mysql集群技术

实验在RHEL7中做,因为9中缺少了一个关键的高可用组件环境:两台数据库,内存和CPU要多一点主流是MYSQL(开源),Oracle收费较贵RHEL7中直接用make编译是有问题的,所以需要要gcc工具做好前置准备&…

自动驾驶嵌入式软件工程师面试题【持续更新】

文章目录前言请描述 CAN 帧的基本结构(包括标识符、数据字段、CRC 等)描述 WebSocket 协议的基本工作流程(包括握手、数据帧结构)请说明如何实现 WebSocket 连接的心跳机制以检测连接状态,并描述在断开后如何通过重连策…

vue(5)-组件

一.组件三大组成部分(结构/样式/逻辑)(1)组件样式冲突用scoped全局样式在组件中起全局作用,局部样式可以加scoped属性来只作用于当前组件图中只给baseone加这个样式,就在baseone中style加scoped&#xff08…

【机器学习】两大线性分类算法:逻辑回归与线性判别分析:找到分界线的艺术

文章目录一、核心概念:数据分类的"切分线"二、工作原理:从"找分界线"理解二、常见算法1、逻辑回归:二分类2、线性判别分析(LDA):分类与降维3、两种算法对比分析三、实际应用&#xff1…

静态分析c/cpp源码函数调用关系图生成

calltree calltree 不好使用 Dpxygen https://www.doxygen.nl/download.html Graphviz https://graphviz.org/download/ 静态代码调用结构图分析、构建、生成 doxygen doxygen在win和linux上均可运行,可以自动分析源码,对c语言项目友好,预处…

使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践

迁移背景与环境原来都是用mysqldump,DTS或者cdc迁移,这次8.0用了下新工具感觉挺好用的,简单快捷,30G数据不到源环境:单机 MySQL 8.0,地址为 172.23.3.28目标环境:InnoDB Cluster 集群&#xff0…

淘宝商品API可以获取哪些商品详情数据?

商品详情页商品全部sku信息"skus": {"sku": [{"price": 45.6,"total_price": 0,"orginal_price": 45.6,"properties": "1627207:39617249736","properties_name": "1627207:39617249736…

新一代PLC控制软件平台EsDA-AWStudio

在工业自动化和智能制造领域,高效的软件平台是提升开发效率和系统性能的关键。ZLG致远电子推出的EsDA-AWStudio平台,凭借其强大的功能和灵活的设计,为工业控制和物联网应用提供了全新的解决方案。一站式PLC工业控制软件平台EsDA-AWStudioZLG致…