C语言入门知识——(7)VS2022的C语言基础调试
1、什么是bug
这个故事很多人都知道
1947年9月9日:第一个“Bug”被发现的时候:“1949年9月9日,我们晚上调试机器的时候,开着的窗户没有纱窗,机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了,我们发现了一只被继电器拍死的飞蛾,翅膀大约4英寸。”
第一次被发现的导致计算机错误的飞蛾,也是第一个计算机程序错误,而bug这个名词也被延用至今。
2、调试是什么
(1)调试的概念
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
(2)调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
- 总结错误的原因
(3)拒绝迷信调试
3、debug和release
(1)两者的概念
- Debug 称为“调试版本”,它包含调试信息,并且不作任何优化,便于程序员调试程序。
- Release 称为“发布版本”,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
(2)Debug和Release的区别
- 文件区别:Debug和Release模式下,会在项目文件里面各自生成一个Debug和Release文件
- 反汇编区别:他们两个的反汇编代码有着明显差别,一般来说Debug比Release多
- 内存区别:由于Debug包含了调试信息,所以会比release的内存要大
- 应用区别:Debug用于程序员调试,release交予测试员和用户使用
- 运行区别:release会在一定程度上对代码进行优化,这也是其内存较小的原因之一
(3)以下代码的运行在Debug和Release模式下,运行结果可能不同
#include <stdio.h>
int main()
{int i = 0;int arr[10] = {0};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
4、windows环境调试介绍
Linux中的调试工具是gdb
(1)模式调整
必须要在Debug模式中才能使得代码正常调试
(2)VS快捷键
- F5启动调试,经常用来直接跳到下一个断点处
- shift+F5取消调试,在不想调试的时候可以用这个功能停止调试
- ctrl+F5开始执行不调试,如果你想要程序直接跑起来而不调试就可以直接使用
- F9创建/取消断点,断点可以使程序在想要的位置任意停止,继而一步步执行下去(在循环语句中尤其好用)
- F10逐过程,通常用来处理一个过程,一个过程可以是一次函数调用或者一条语句
- F11逐语句,就是每次都执行语句,这个快捷键可以使得我们的执行逻辑进入函数内部(是最为常用的快捷键),执行调试比较细一点
- 更多快捷键
(3)调试窗口
-
查看临时变量的值(监视):在vs2022调试状态下----窗口----监视
- 一个小技巧,如果是监视指针,将格式写为【指针,数字】就可查看该指针后面指针的值
-
查看内存信息:在vs2022调试状态下----窗口----内存
-
查看调用堆栈:在vs2022调试状态下----窗口----调用堆栈
- 通过调用堆栈可以清晰反应函数的调用关系以及当前调用所处的位置
- 这个涉及到数据结构的栈
-
查看汇编信息
- 第一种查看方法:调试开始之后右键代码,选择“转到反汇编”
- 第二种查看方法:在vs2022调试状态下----调试----窗口----反汇编
-
查看寄存器信息:在vs2022调试状态下----调试----窗口----寄存器
- 通过寄存器窗口可以看到当前运行环境的寄存器运行信息
- 如果记住寄存器的名字还可以在监视窗口里面查看寄存器的
-
查看自动窗口:在vs2022调试状态下----调试----窗口----自动窗口
- 会自动添加、自动取消添加一些变量的信息
-
查看局部变量:在vs2022调试状态下----调试----窗口----局部变量
5、一些调试的实例
(1)实例1:实现代码:求 1!+2!+3! …+ n! ,不考虑溢出
int main()
{int i = 0;int sum = 0;//保存最终结果int n = 0;int ret = 1;//保存n的阶乘scanf("%d", &n);for(i=1; i<=n; i++){int j = 0;//问题在这里的上一步没有加上ret = 1;for(j=1; j<=i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}//这时候我们如果3,期待输出9,但实际输出的是15。
(2)实例2:研究程序死循环/异常终止的原因
#include <stdio.h>
int main()
{int i = 0;int arr[10] = {0};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}
//这个代码在Debug模式下就会死循环或者异常终止(要看环境的具体实现),在Release模式下就会停止,这就是优化导致的
//比如在我的vs2022中,x86是死循环的,x64是在结尾终止的
6、如何写出易于调试的代码?
(1)优秀的代码
- 代码运行正常
- bug很少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
当然还有很多很多类似的比较体系化的技巧。
(2)常见的编码技巧
- 使用assert
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱
(3)const的作用
使得变量具有常属性,可以让代码具有鲁棒性、健壮性,能够应对一些异常的情况
int main()
{const int m = 100;const int * p = &m;const int ** pp = &p;int *** ppp = &pp;***ppp = 200;printf("%d\n", m);return 0;
}
#include <stdio.h>
//代码1
void test1()
{int n = 10;int m = 20;int *p = &n;*p = 20;//ok?p = &m; //ok?
}
void test2()
{//代码2int n = 10;int m = 20;const int* p = &n;*p = 20;//ok?p = &m; //ok?
}
void test3()
{int n = 10;int m = 20;int *const p = &n;*p = 20; //ok?p = &m; //ok?
}
int main()
{//测试无cosnt的test1();//测试const放在*的左边test2();//测试const放在*的右边test3();return 0;
}
(4)模拟strcpy函数
①官方库里的写法
/***
*char *strcpy(dst, src) - copy one string over another
*
*Purpose:
* Copies the string src into the spot specified by
* dest; assumes enough room.
*
*Entry:
* char * dst - string over which "src" is to be copied
* const char * src - string to be copied over "dst"
*
*Exit:
* The address of "dst"
*
*Exceptions:
*******************************************************************************/
char * strcpy(char * dst, const char * src)//(目的数组,源头数组)
{char * cp = dst;assert(dst && src);while(*cp++ = *src++); /* Copy src over dst */return (dst);
}//其函数就是将一个字符串数组的内容拷贝到另外一个字符串数组中
②自己定义的写法
//方法一:
void my_strcpy(char* dest, char* src)//(目标数组,源头数组)
{while(*src != '\0'){*dest++ = *src++;}*dest = *src;//\0的拷贝
}
//方法二:
void my_strcpy(char* dest, char* src)
{while(*dest++ = *src++){;}
}
//方法三:
void my_strcpy(char* dest, char* src)
{//断言,或者改成assert(dest && src)assert(dest != NULL);assert(src != NULL);while(*dest++ = *src++){;}
}
//方法四:
void my_strcpy(char* dest, char* src)
{//断言,或者改成assert(dest && src)assert(dest != NULL);assert(src != NULL);while(*dest++ = *src++){;}
}
//方法五:
char* my_strcpy(char* dest, char* src)
{assert(dest && src);char* ret = dest;while(*dest++ = *src++);return ret;
}
(5)模拟strlen函数
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* str)
{int count = 0;assert(str);//assert(str != NULL);//断言的使用while(*str)//while (*str != '\0'){count++;str++;}return count;
}
int main()
{int len = my_strlen("abcdef");printf("%d\n", len);return 0;
}
7、编程常见的错误
- 编译型错误:直接看错误提示信息(双击VS2022中的错误列表),解决问题。或者凭借经验就可以搞定。相对来说简单
- 链接型错误:看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误(一般会出现字眼“无法解析的外部命令”)
- 运行时错误:借助调试,逐步定位问题,最难搞
相关文章:
C语言入门知识——(7)VS2022的C语言基础调试
1、什么是bug 这个故事很多人都知道 1947年9月9日:第一个“Bug”被发现的时候:“1949年9月9日,我们晚上调试机器的时候,开着的窗户没有纱窗,机器闪烁的亮光几乎吸引来了世界上所有的虫子。果然机器故障了,…...
数据库可视化开发工具内容介绍
在现代化办公环境中,数据管理的重要性不言而喻。对于企业来说,将企业内部的数据做好规划和管理,可以给企业提升办公协作效率,为企业高层做出正确的经营决策奠定基础。本文主要给大家介绍的是数据化可视化开发工具的内容࿰…...
坚如磐石:TiDB 基于时间点的恢复(PiTR)特性优化之路丨6.5 新特性解析
本文介绍了 TiDB 数据库的基于时间点的恢复(PiTR)特性,该特性允许用户将数据库恢复到特定时间点,从而避免丢失重要数据。文章首先介绍了 PiTR 技术的基本概念和工作原理,接着探讨了 TiDB 对 PiTR 的优化,包…...
【云原生】K8S中PV和PVC
前言 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。…...
24小时稳定性爆肝测试!国内外5款远程控制软件大盘点
本文目录前言一、ToDesk远程控制二、向日葵远程控制三、RayLink四、TeamViewer五、AnyDesk总结前言 不论你的职业是什么,从事互联网工作基本就离不开远程,从远程安装系统到远程搞设计,再到做服务器的调控,都需要靠远程来协助完成…...
【Java集合框架】篇三:List接口
1. List接口及主要实现类特点 List:有序、可重复(“动态”数组);因而常常使用List替换数组,因为List 的容量是动态的。 ArrayList:底层使用Object[]存储 线程不安全,添加、查找效率高 LinkedL…...
【算法经典题集】二分(持续更新~~~)
😽PREFACE🎁欢迎各位→点赞👍 收藏⭐ 评论📝📢系列专栏:算法经典题集🔊本专栏涉及到的知识点或者题目是算法专栏的补充与应用💪种一棵树最好是十年前其次是现在二分整数二分机器人…...
【c++】2023杭州月薪个税计算(chatGPT帮忙加注释)
参考信息 杭州市的个人所得税起征点是每月5000元。 个人所得税税率标准: 1、工资范围在1-5000元之间的,包括5000元,适用个人所得税税率为0%; 2、工资范围在5000-8000元之间的,包括8000元,适用个人所得税税率为3%; 3、工…...
【TypeScript】的上手学习指南!
目录TS简介TypeScript是什么?为什么要推荐使用TypeScript生态支持安装TypeScriptTS简介 TypeScript是什么? TypeScript官网 简介:TypeScript是JavaScript类型的超集,它可以编译成纯JavaScript。TypeScript可以在任何浏览器、任何计…...
红黑树(Insert())
文章目录红黑树代码红黑树性质红黑树vsAVL树红黑树的实现Insert()情况一:如果我插入的新节点时红色的情况二:叔叔是黑色或者不存在情况三: cur红,p为红,g为黑,u不存在或者为黑-双旋检查erase()红黑树vsAVL树红黑树的应用:红黑树 二叉搜索树 …...
MOV指令使用
mov用于数据传送。之后分为目的操作数和源操作数,目的操作数必须是通用寄存器或者内存单元:源操作数可以是具有相同数据宽度的通用寄存器或者内存单元,还可以是立即数。传送指令只影响目的操作数内容,不改变源操作数内容。 如&am…...
解释一下RecyclerView的适配器内部方法
RecyclerView的适配器(Adapter) 是一个连接数据模型和RecyclerView的桥梁,它在RecyclerView中提供了数据和布局之间的连接。下面是RecyclerView适配器中常用的几个方法的解释: 1.onCreateViewHolder(ViewGroup parent, int view…...
集合框架及背后的数据结构
1.介绍: Java 集合框架,又被称为容器是定义在 java.util 包下的一组接口 interfaces 和其实现类 classes 。 其主要表现为将多个元素置于一个单元中,用于对这些元素进行快速、便捷的存储、检索 、管理 ,即平时我们俗称的增删查改…...
【强化学习】强化学习数学基础:蒙特卡洛方法
强化学习数学方法:蒙特卡洛方法举个例子举个例子1:投掷硬币The simplest MC-based RL algorithm举个例子2:Episode lengthUse data more efficientlyMC without exploring starts总结内容来源将value iteration和policy iteration方法称为mod…...
BI分析工具软件有哪些
最近发现很多人讨论BI数据分析,今天给大家全面介绍下BI数据分析相关的信息。首先给大家科普一下,什么是BI分析。 BI分析其实是指通过BI分析工具,对企业内部和外部的大量数据进行收集、整理、处理和分析,以提供有价值的洞察&#x…...
2023爱分析·RPA软件市场厂商评估报告:容智信息
目录 1. 研究范围定义 2. RPA软件市场分析 3. 厂商评估:容智信息 4. 入选证书 1. 研究范围定义 RPA即Robotic Process Automation(机器人流程自动化),是一种通过模拟人与软件系统的交互过程,实现由软件机器人…...
设计模式之七大原则(二)——里氏替换原则、依赖倒转原则
1.里氏替换原则 里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》)里提…...
数据库日常实操优质文章分享(含Oracle、MySQL等) | 2023年2月刊
本文为大家整理了墨天轮数据社区2023年2月发布的优质技术文章,主题涵盖Oracle、MySQL、PostgreSQL等数据库的环境搭建、故障处理等日常实践操作,以及概念梳理、常用脚本等总结记录,分享给大家:Oracle优质技术文章概念梳理&基础…...
事件循环机制(Event Loop)和宏任务(macro-tast)微任务(micro-tast),详细讲解!!!
“事件循环机制” 和 “宏任务微任务” 也是前端面试中常考的面试题了。首先,要深刻理解这些概念的话,需要回顾一些知识点。知识点回顾1、进程与线程进程。 程序运行需要有它自己的专属内存空间,可以把这块内存空间简单的理解为进程每个应用至…...
mysql基础操作3
查询襄阳的员工姓名和性别,性别要求显示为 男 女SELECT ename,(CASE WHEN sexF THEN 女 ELSE 男 END)sexFROM empWHERE jiguan襄阳查询所有的订单,显示订单日期 订单数量 订单状态SELECT saleDate,salesQuantity,(CASE WHEN saleState1 THEN 新建 WHEN s…...
【Web安全】PHP安全
一、文件包含漏洞严格来说,文件包含就是代码注入的一种。代码注入,其原理就是注入一段用户能控制的脚本或代码并让服务器端执行。代码注入的典型代表就是文件包含。文件包含可能会出现在JSP、PHP、ASP等语言中,常见函数如下:PHP&a…...
双向链表+循环链表
循环链表双向链表 循环链表 循环链表是头尾相接的链表(即表中最后一个结点的指针域指向头结点,整个链表形成一个环)(circular linked list) **优点:**从表中任一结点出发均可访问全部结点 循环链表与单链表的主要差别当链表遍历时,判别当前…...
Java程序的逻辑控制
一、顺序结构 顺序结构比较简单,如果我们按照代码书写的顺序一行一行执行,将会是这样的: System.out.println("aaa"); System.out.println("bbb"); System.out.println("ccc"); // 运行结果 aaa bbb ccc 如…...
BUCTOJ - 2023上半年ACM蓝桥杯每周训练题-1-A~K题C++Python双语版
文章目录BUCTOJ - 2023上半年ACM&蓝桥杯每周训练题-1-A~K题CPython双语版前言问题 A: 1.2 神奇兔子数列题目描述输入输出解题思路AC代码CPython问题 B: 1.3 马克思手稿中的数学题题目描述输入输出解题思路AC代码CPython问题 C: 1.4 爱因斯坦的阶梯题目描述输入输出解题思路…...
存储的本质-学习笔记
1 经典案例 1.1 数据的流动 一条用户注册数据流动到后端服务器,持久化保存到数据库中。 1.2 数据的持久化 校验数据的合法性修改内存写入存储介质2 存储&数据库简介 2.1 存储系统特点 性能敏感、容易受硬件影响、存储系统代码既“简单”又“复杂”。 2.2 数…...
新一代骨传导机皇重磅发布:南卡Neo骨传导运动耳机,性能全面提升
近日,中国最强骨传导品牌NANK南卡发布了最新一代骨传导耳机——南卡Neo骨传导耳机!该款耳机与运动专业性更强的南卡runner Pro4略微不同,其主要定位于轻运动风格,所以这款耳机的音质和佩戴舒适度达到了令人咂舌的地步!…...
Hbase Schema设计与数据模型操作
一、Hbase Schema设计 1,Schema 创建 使用 Apache HBase Shell 或使用 Java API 中的 Admin 来创建或更新 HBase 模式。 Configuration config HBaseConfiguration.create(); Admin admin new Admin(conf); TableName table TableName.valueOf("myTable&…...
微电影广告有哪些传播优势?
微电影广告是在基于微电影的模式下发展而来的,是伴随着当下快节奏、碎片化的生活方式而诞生的新兴广告表现形式。微电影广告凭借其具备的独特传播优势以及时代特征成为广大企业主塑造企业品牌形象的主要方式。那么,微电影广告究竟有哪些传播优势…...
html基础(列表(ul、ol、dl)、表格table、表单(input、button、label)、div和span、空格nbsp)
1无序列表<ul>和有序列表<ol>1.1无序列表<ul><!-- 无序列表 --><ul><li>吃饭</li><li>睡觉</li><li>打豆豆</li></ul>1.2有序列表<ol><!-- 有序列表 --><ol><li>吃饭</li…...
uniapp常用标签
view ~~ 视图容器类似于传统html中的div,用于包裹各种元素内容<view><text>hh</text> </view>scroll-view ~~可滚动视图区域scroll-x 允许横向滚动scroll-y 允许纵向滚动scroll-top 设置竖向滚动条位置,可以一键回到顶部refresh…...
网站建设图片上传/网络推广是什么工作
从另外1台机器配置好的vdi文件,拷贝到本机上的virtualbox导入。 1开始以为是和另外1台虚拟机的ip冲突,然后把ip改了。还是不行。报了 一系列的问题,通过网上解决方案都没啥用。 后来想到有可能是virtualbox网络配置的问题,然后和…...
广州越秀番禺最新通告/浙江seo推广
一、用户输入验证1、手工编程验证动作类中的所有方法进行验证:步骤:a、动作类继承ActionSupportb、覆盖调用public void validate()方法c、在validate方法中,编写不符合要求的代码判断,并调用父类的addFieldError(String fieldNam…...
wordpress更新版本/电脑零基础培训学校
旅游管理系统设计图 旅游管理系统的设计与实现前台(用户)首页景点美食酒店交通后台(管理员)首页用户管理景点信息管理美食信息管理酒店信息管理交通信息管理旅游攻略行去旅行住乐服务玩喝吃SSMMySQLIDEA智慧旅游在线平台的设计与实…...
海安环评在哪个网站做/周口网络推广哪家好
直接症状:直接双击打开一个文件,比如一个 Word 文档,要等超过15秒的时间,如果先打开 Word,然后再把文档拖到 Word 中则正常。 在某文件上点击右键,弹出右键菜单需要超过15秒的时间。 对某个文件进行键盘上的…...
wordpress文章 插件/微商推广哪家好
Internet 的50年口述历史第四部分,讲述了微软同 Netscape 的浏览器之争,同时讲述了微软最终如何在反托拉斯案中获胜,成功地将 IE 同 Windows 捆绑并获得历史性胜利。Internet 的50年口述历史的其它章节请参阅,第一部分,…...
鞍山网站制作价格/app软件推广怎么做
今天看了一节经典 的“ 3D 计算机视觉”历史简介,就是年代稍稍久远了些。下面通过思维导图的形式进行展示。(免责声明:视频是2012年的,因此最新的发展未总结。并且,博主理解能力有限,内容仅供参考ÿ…...