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

该学会是自己找bug了(vs调试技巧)

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言初阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性.
金句分享:
✨夜色难免黑凉,前行必有曙光.✨

目录

  • 前言
  • 程序猿们每天都在写bug?
  • 一、调试是什么?
  • 二、两个版本的介绍(Debug和Release)
  • 三、调试的快捷键
  • 四、调试窗口
    • 4.1 监视窗口(查看变量的值)
    • 4.2 自动窗口
    • 4.3 内存窗口
  • 五.编程常见的错误

本篇是c语言初阶的最后一篇,加油!!!

程序猿们每天都在写bug?

bug是什么?
1947 年 9 月 9 日:世界上的第一个“Bug”被发现.
日记:
“1949 年 9 月 9 日,我们晚上调试机器的时候,开着的窗户没有纱窗,机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了,我们发现了一只被继电器拍死的飞蛾,翅膀大约 4 英寸。”

格蕾丝·霍普(Grace Hopper)用发夹取出飞蛾,把它粘在日志里,并标注:“First actual case of bug being found”(找到了第一个 Bug)。这件计算机史上的奇闻轶事,使“Bug”作为计算机领域的专用词汇,一直沿用至今。

下图是当时的日记图片:

现在的程序员依旧逃不出“Bug”的魔爪,初学者可能大部分时间在写代码,只有少部分时间在找bug.但是大部分已经工作的程序猿,在工作的一天里,20% 的时间是在写代码,80% 的时间是在找 Bug

讲个笑话:
如果你在一个技术岗位周围听到了一声崩溃的惨叫,不要慌张,这可能是某个程序员找 Bug 找的崩溃了。如果一群程序员同时发出惨叫,那可能是有人把电源线踢掉了。
在这里插入图片描述

一、调试是什么?

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

简单来说,调试就是一个在找bug的过程.

一名优秀的程序员是一名出色的侦探。
如果bug的出现是"犯罪",那么每一次调试都是尝试破案的过程.
一件事情的发生都是有迹可循的,顺着思路写代码出现了bug,这相当于犯罪的过程,逆流而上便是调试的工作,这便是寻找真相的过程.

二、两个版本的介绍(Debug和Release)

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

在这里插入图片描述

观察Debug区别和Release版本的区别:

测试代码:

#include <stdio.h>
int main()
{printf("初阶牛,你好!!!\n");return 0;
}

当我们运行之后:
观察比较代码运行后形成的.exe文件在硬盘上存放所占字节大小.

Debug版本:
在这里插入图片描述

Release版本:
在这里插入图片描述

上述情况可以证明Release版本会对代码进行各种优化,使得代码大小变小.
Debug版本要保存调试信息,相对占用大小要更大一点.

编译器进行了哪些优化呢?
🌰当我们写出一个数组越界访问的代码时:

#include <stdio.h>
int main()
{int i = 0;int arr[5] = { 0 };for (i = 0; i < 10; i++)//越界访问{arr[i] = i;printf("%d\n", i);}return 0;
}

Debug版本调试结果:
在这里插入图片描述
Release版本调试结果:
在这里插入图片描述
不难发现,即使数组越界访问,在Release版本直接被优化掉了,并不会产生报错信息.

补充知识:
你用的是什么编译器?
vs2019?或者vs2022?
其实这些准确来说不能成为编译器,vs称为IDE(集成开发环境)
编辑器+编译器+调试器

三、调试的快捷键

调试时,快捷键的使用可以大大提高我们的调试效率,所以熟练的使用快捷键是很有必要的.

F5:启动调试

经常用来直接跳到下一个断点处。如果没有设置断点就会直接运行.

F9:创建断点和取消断点

断点的重要作用,可以在程序的任意位置设置断点。
这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

F10:逐过程

通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。,主要用于跳过确定没有问题的函数,不需要进入函数内部一条条语句调试.

F11:逐语句

就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的情况)。

CTRL + F5:开始执行不调试

如果你想让程序直接运行起来而不调试就可以直接使用。

四、调试窗口

4.1 监视窗口(查看变量的值)

F11进入调试状态,单击"调试"选项卡,选择"窗口"命令,在子菜单中选择"监视命令".
四个监视窗口都是一样的,随意选择一个即可.
在这里插入图片描述
在打开的"监视"的窗口中,可以输入想要观察的变量,十分方便,个人是很喜欢vs的调试环境的.推荐使用"监视窗口"观察变量.

请通过调试,观察变量的变化,找出代码出错的地方.
示例:
请用自定义函数的形式编程实现,求s = m!+ n!+ k!,
其中m、n、k从键盘输入(值均小于7)。

#include <stdio.h>
#define Max 7int Factorial(int m)//计算阶乘的函数
{int ret = 0;while (m){ret *= m;m--;}return ret;
}
int main()
{int m = 0, n = 0, k = 0;int s = 0;//记录这三个阶乘的和printf("请分别输入m,n,k的值:\n");scanf("%d%d%d", &m, &n, &k);if (m < Max && n < Max && k < Max){s=Factorial(m) +Factorial(n) +Factorial(k);//分别调用计算阶乘的函数printf("这三个数的阶乘之和是:%d", s);}else{printf("很抱歉,你输入的三个数中,有大于7的数.\n");}return 0;
}

在这里插入图片描述
答案:
出错原因:Factorial函数中,ret初始化为0,出现错误,应当初始化为1,因为0与任何数的乘积都为0;
通过监视窗口,不难发现,ret计算阶乘时值一直为0;

4.2 自动窗口

"监视"窗口,要求自己手动输入需要观察的变量.
自动窗口不需要自己输入观察的变量,会自动出现.
缺点是"自动窗口"中的变量会动态显示,只会显示当前正在操作涉及的部分变量,当进入一个函数时,函数外的变量就观察不到.并不推荐使用

4.3 内存窗口

在这里插入图片描述
在内存窗口中,可以输入想要观察的变量的内存地址,甚至可以细致到每一个字节.
在这里插入图片描述
当然,vs还提供了"调用堆栈",“反汇编”,"寄存器"等多种类型的窗口方便调试,就不一 一介绍了,可以自己去试着调试,观察.

五.编程常见的错误

7.1 编译型错误
编译器会直接标红,例如:

语法错误,
中英文错误
括号不完整等

这类错误很好发现,也能很快的解决,并不是很复杂的错误.根据编程经验就可以解决.
语句后面忘记":"分号

在这里插入图片描述

5.2 链接型错误
编译器会给出错误信息,主要在代码中找到错误信息中的标识符,。一般是标识符名不存在或者拼写错误。这也是不难解决的问题.
在这里插入图片描述
5.3 运行时错误

这是最难解决的的问题,只有在运行时,发现并不是自己想要的结果.
这类问题只能通过调试,一步步解决,当代码比较复杂时,一步步调试会显得特别繁琐,这时可以借助F9创建断点,和F10逐过程(不进入函数内部),跳过部分没有出问题的代码区域,即使是这样,这类问题还是很难得以解决.
在这里插入图片描述

遇见bug不要太难过,也不要过度生气,自己解决就行了,虽然bug的出现让人很头痛,可能几个小时都无法找到原因,但是我们通过调试,在"破案"的过程中,也许也会收获很多,成功"破案"后的喜悦也是很甜的哟!!!

希望各位小伙伴,可以多多尝试调试,这也是一种很重要的能力,提高自己的代码编程能力.

下面是一些可以试着练习调试的代码:
试着找出原因吧!!!

示例1:这段代码是在x86环境下运行

在这里插入图片描述

#include <stdio.h>
int main()
{int i = 0;int arr[10] = { 0 };for (i = 0; i <= 12; i++){arr[i] = 0;printf("初阶牛加油,加油!!!\n");}return 0;
}

示例2:输入密码

#include <stdio.h>
#define MAX 3
int main()
{char arr1[] = { "初阶牛666" };char arr2[20];printf("请输入密码:\n");int i=MAX;while(i){printf("你还有%d次机会:",i);scanf("%s", arr2);if (arr1==arr2){printf("密码成功");break;}else printf("密码错误,请重新输入:\n");i--;//机会-1}if(i==0)//如果机会用完了printf("\n很遗憾你的机会用完了");return 0;
}

在这里插入图片描述

答案:
示例1;
当i=12时,令arr[12]=0,此时i的地址和arr[12]的地址是同一块空间,会将i赋值为0
至于为什么是12,是由编译器决定的.
在这里插入图片描述

示例2:
错误:比较两个字符串不能使用==,调试会发现即使密码输入正确,依旧会显示错误.
解决方法:

if (arr1==arr2)
改成if (strcmp(arr1, arr2)==0)

补充小知识:
strcmp是c语言提供的一种库函数,用于比较两个字符串
此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续以下对,直到字符不同或达到终止空字符。

返回值.
小于0第一个不匹配的字符在 str1 中的值低于 str2 中的值
0两个字符串的内容相等
大于0第一个不匹配的字符在 str1 中的值大于在 str2 中的值

代码如下

#include <stdio.h>
#include <string.h>
#define MAX 3
int main()
{char arr1[] = { "初阶牛666" };char arr2[20];printf("请输入密码:\n");int i=MAX;while(i){printf("你还有%d次机会:",i);scanf("%s", arr2);if (strcmp(arr1, arr2)==0)//判断字符串相等{printf("密码成功");break;}else printf("密码错误,请重新输入:\n");i--;//机会-1}if(i==0)//如果机会用完了printf("\n很遗憾你的机会用完了");return 0;
}

到目前为止,c语言初阶的内容就全部更新完成了,感谢大家的支持!!!
后面就是c语言进阶的内容了.
在这里插入图片描述

相关文章:

该学会是自己找bug了(vs调试技巧)

前言 &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍c语言初阶的最后一篇.有关调试的重要性. 金句分享…...

Redis大全(概念与下载安装)

目录 一、概念 1.非关系型数据库&#xff08;NoSQL&#xff09;的介绍 2.什么是redis 3.redis的作者 4.Redis的特点 5.redis的应用场景 6.高度概括知识 一、二 缓存穿透、缓存击穿、缓存雪崩的概念 &#xff08;一&#xff09;缓存穿透 &#xff08;二&#xff09;缓…...

指针的进阶【上篇】

文章目录&#x1f4c0;1.字符指针&#x1f4c0;2.指针数组&#x1f4c0;3.数组指针&#x1f4bf;3.1.数组指针的定义&#x1f4bf;3.2. &数组名VS数组名&#x1f4bf;3.3.数组指针的使用&#x1f4c0;1.字符指针 int main() {char ch w;char* pc &ch;// pc就是字符指…...

MATLAB | 如何用MATLAB绘制花里胡哨的山脊图

本期推送教大家如何绘制各种样式的山脊图&#xff0c;这里做了一个工具函数用来实现好看的山脊图的绘制&#xff0c;编写不易请多多点赞&#xff0c;大体绘制效果如下&#xff1a; 依旧工具函数放在文末。 教程部分 0 数据准备 数据为多个一维向量放在元胞数组中&#xff0c;…...

.Net与程序集

一个简单的C#程序回想一下我们第一个.net 程序 hello world&#xff0c;它具有那些步骤呢&#xff1f;打开visual studio创建一个C# console的项目build运行程序这时候就有一个命令行窗口弹出来&#xff0c;上面打印着hello world。我们打开文件夹的bin目录&#xff0c;会发现里…...

软考中级之数据库系统(重点)

涉及考点:数据库模式,ER模型,关系代数与元祖演算,规范化理论,并发控制,分布式数据库系统,数据仓库和数据挖掘 数据库模式 三级模式-二级映射 常考选择题 三级模式,两种映射的这种涉及属于层次架构体的设计,这种设计为我们在应用数据库的时候提供了很多便利,同时提高了整个体…...

界面控件DevExtreme的Data Grid组件——让业务信息管理更轻松!

DevExtreme拥有高性能的HTML5 / JavaScript小部件集合&#xff0c;使您可以利用现代Web开发堆栈&#xff08;包括React&#xff0c;Angular&#xff0c;ASP.NET Core&#xff0c;jQuery&#xff0c;Knockout等&#xff09;构建交互式的Web应用程序&#xff0c;该套件附带功能齐…...

【架构师】零基础到精通——网关策略

博客昵称&#xff1a;架构师Cool 最喜欢的座右铭&#xff1a;一以贯之的努力&#xff0c;不得懈怠的人生。 作者简介&#xff1a;一名退役Coder&#xff0c;软件设计师/鸿蒙高级工程师认证&#xff0c;在备战高级架构师/系统分析师&#xff0c;欢迎关注小弟&#xff01; 博主小…...

【java 8】方法引用与构造器引用

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…...

SGI 空间配置器

前言 空间配置器是 STL 六大组件之一&#xff0c;它总是隐藏在容器的背后&#xff0c;默默工作&#xff0c;默默付出。本文为《STL 源码剖析》读书笔记&#xff0c;主要讨论 SGI 版本空间的配置和释放&#xff0c;对代码进行解读时会改变一些写法&#xff0c;使其更易于阅读。…...

2023年白酒行业研究报告

第一章 行业概况 白酒是中国传统的酿酒业之一&#xff0c;历史悠久&#xff0c;源远流长。白酒指以高粱等粮谷为主要原料&#xff0c;以大曲、小曲或麸曲及酒母等为糖化发酵剂&#xff0c;经蒸煮、糖化、发酵、蒸馏、陈酿、勾兑而制成的&#xff0c;酒精度(体积分数)在18%-68%…...

华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】

合规数组 题目 给定一个正整数数组 检查数组中是否存在满足规则的数组组合 规则: A = B + 2C 输入 第一行输出数组的元素个数 接下来一行输出所有数组元素,用空格隔开 输出 如果存在满足要求的数 在同一行里依次输出规则里A B C的取值,用空格隔开 如果不存在输出0 示…...

华为OD机试真题Python实现【英文输入法】真题+解题思路+代码(20222023)

英文输入法 主管期望你来实现英文输入法单词联想功能,需求如下: 依据用户输入的单词前缀,从已输入的英文语句中联想出用户想输入的单词。按字典序输出联想到的单词序列,如果联想不到,请输出用户输入的单词前缀。注意 英文单词联想时区分大小写缩略形式如"don’t&quo…...

改进YOLO系列 | 添加轻量化Decouple_Head 和 ASFF_Head

绿色为ASFF_Head,浅蓝色Decoupled_Head,深蓝色是第三步加的_initialize_dh_biases方法后的效果。 参数量与计算量对比 模型参数量 parameters计算量GFLOPsyolov5s_Head723538916.5ASFF_Head1267484725.0Decoupled_Head892869722.0结构图 本篇介绍的这个Decouple_Head和YOLOX…...

LLFlow沦为和代码解读

LLFlow沦为和代码解读 1.测试时代码的运行位置 sr&#xff1a;什么意思 sr 和 z 这里又将模型设置为了训练模式 所以下面这部分代码应该是测试时运行的所有代码 这个就是测试时使用的网络模型框架 下面应该就是self.netG的网络模型框架 但是这个z的网络模型框架代码还不…...

C语言学习及复习笔记-【9】数组

目录9. 数组9.1 数组的定义9.2 数组与指针的区别9.3 数组大小计算9.4 数组的赋值9.5多维数组寻址方式9.6 函数数组9. 数组 9.1 数组的定义 C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往…...

Kubernetes入门教程 --- 使用kubeadm进行集群安装

Kubernetes入门教程 --- 使用kubeadm和二进制安装1. Introduction1.1 架构图1.2 关键字介绍1.3 简述2. 使用Kubeadm Install2.1 申请三个虚拟环境2.2 准备安装环境2.3 配置yum源2.4 安装Docker2.5 时间同步2.6 安装组件2.7 部署集群2.8 Master安装网络插卡3. 查询状态3.1 查询n…...

华为OD机试真题Python实现【相对开音节】真题+解题思路+代码(20222023)

相对开音节 题目 相对开音节构成的结构为辅音+元音(aeiou)+辅音(r除外) 常见的单词有bike cake 给定一个字符串,以空格为分隔符 反转每个单词的字母 若单词中包含如数字等其他非字母时不进行反转 反转后计算其中含有相对开音节结构的子串个数 (连续子串中部分字符可以重复) …...

海思SD3403/SS928V100开发(5)MIPI_YUV相机vio sample开发----修改思路

1. 前言 sensor输出格式: YUV422 8bit 硬件连接: MIPI_YUV相机(4lane MIPI) -> SS928V100 MIPI0(4lane) 框图: 2. 几个问题 基于SS928 SDK中的 vio sample修改; 但是sample里面都是基于RAW RGB sensor开发的sample, 没有现成的MIPI_YUV sensor的参考,需要自己…...

javaee之node.js与es6

问题1&#xff1a;在IDEA控制台为什么node显示不会出来命令 修改完之后记得重新启动电脑 问题2&#xff1a;response.end()作用 在Web开发中&#xff0c;浏览器端的请求到达服务器进行处理的时候&#xff0c;Response.End的作用就是让request执行到此结束&#xff0c;输出到客户…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...