代码调试技巧

news2024/11/24 14:22:14

目录

1.为什么要进行调试? 

2.调试的基本步骤

3.关于Debug版本和Release版本

4.调试技巧

5.调试总结


 我还是喜欢真实的世界,因为在那里,我可以通过自己的努力来改变残酷的现实

本专栏适用于有一定C语言基础并且还要继续学习的人 

往期回顾:

代码调试技巧

C语言函数详解

C语言操作符详解

C语言实现扫雷及进阶

C语言实现三子棋

C语言实现猜数字游戏

C语言for循环详解

C语言初学可能会遇到的问题(一)

文章质量在努力提高中...

本文将介绍编写程序过程中最重要的一环,调试代码。刚开始,我们可能会花80%时间写代码,20%时间调试代码;但一个程序员可能20%的时间在写代码,80%时间都在调试代码,熟练掌握代码调试技巧是编程水平进步的重要基石。

一般在进行软件开发的时候,会先根据用户的需求建立项目,然后需求收集、需求分析、设计、开发、测试、验收、发布、上线这几个过程。当软件设计步骤完成后,程序员就要进行开发,在开发过程中,写代码是重要的,但更重要的是对代码进行调试,一份经过反复调试过的代码,出错率和测试通过率都会大大提高,整个项目的进程就能尽快完成。

1.为什么要进行调试? 


先看上面的图片,相信很多新手刚开始编写程序都是下面这种情况,运行,不通过,改一下,再运行,还不通过,再改……最后改了几个小时之后,突然通过了,但是为什么呢?最后甚至都不知道真正的问题所在。几十行,几百行代码能允许我们这样“试错”,但是几千行,几万行呢?学会调试就必不可少了,调试可以让我们通过每一条代码,去感受程序的运行,进而发现错误,修改错误,极大的提高了软件开发的效率。

2.调试的基本步骤

(1)发现程序的错误(程序运行出错,或不符合预期结果)
(2)以隔离、消除等方式对错误进行定位(逐步调试或设置断点进行监控,找到程序运行过程中与自己期望不符合的代码行或子程序)
(3)确定错误产生的原因(算法、语法、用法、越界、逻辑等错误)
(4)提出纠正错误的解决办法(思考改进,查阅资料,浏览社区,向大神请教等)
(5)对程序错误予改正,重新测试

3.关于Debug版本和Release版本

Debug版本和Release版本是软件开发中经常使用的两种编译模式。
Debug版本是调试版本。Debug模式下生成的程序包含调试信息,不进行任何优化,便于程序员调试程序,程序员写代码经常就用的是这个版本。
Release版本是发布版本。Release模式下生成的程序不包含调试信息,是根据用户需求,进行了各种优化,以期达到代码最小和速度最优,为用户的使用提供便利

4.调试技巧

(1)调试快捷键
当电脑点击f10,f11,f9,f5不起作用时,可能是fn的问题,使用下面介绍到的调试快捷键的时候再加上fn即可
F10:逐过程调试(不会进入函数,直接将函数当语句运行)
F11:逐语句调试(进入函数,更细致)
F9:设置断点。断点,就是调试中断的地方,在需要调试中断的地方右键确定对应语句处,再按F9,即可设置断点,一个段代码可以设置多个断点。设置好断点后,在程序的前面会出现一个红圈,右击红圈,即可设置断点条件,例如i==100;
F5:运行代码,跳到下一个断点处。如果没有断点,按F5将直接运行代码结束。如果有多个断点,按F5就将按顺序运行代码至断点1,再按F5就将按顺序运行代码至断点2……
(2)调试
用vs2022举例,vs2022中要先点击F10或者F10+Fn,然后在上方界面中选择调试,在调试中选择窗口,才能找到下文所说的调试选项。其他版本编译器可能有些按键选项不同,大家可在百度进行查询。

未点击F10或者F10+Fn前的上方界面

 点击F10或者F10+Fn后的上方界面


 窗口监视变量

按了F10后,在调试里面找到窗口,在窗口中找到监视,在监视1、2、3、4中任选一个窗口即可

监视选项可以监视代码调试过程中变量的变化情况,用F11逐语句调试代码后,可比较监视变量的实际值与预期值的差异,进而判断代码是否在此处出错 

这个是添加了监视窗口后的界面。如图为判断水仙花数的代码,现在我要观察一下代码运行过程中判断位数的变量count的变化情况,可在下方‘添加要监视的项’中输入count,即可观察变量count代码一步一步运行过程中的值是如何变化的。

但是上面的代码,i的值要改变100000次,如果要观察程序在判断位数这段是否出现错误,就不太容易了,因此还要用到F9(设置断点)中断点条件,此处分别找一个4位数和一个5位数来设置断点条件来监视程序是否正确

设置断点条件为i==56789,然后点击F5,代码就会自动运行至i==56789时,位于当时的for循环里,再点击F11可以一步一步调试后面的那个for循环,观察count的变化情况

此时i=5678,count=4,为4位数,再判断56789

此时i=56789,count=5,为5位数,正确 

窗口变量内存

可在内存中任意选择一个进行监视

这是打开监视后的界面

 在最右边的‘列’处,将自动改为4,可以显示4个字节的内容,再查看i的地址

在窗口中观察内存时可以直接观察到每个字节内的存储

5.调试总结

(1) 现在的软件环境在不断向着大型化 、并行化、复杂化方向发展 , 定位瑕疵的难度也在随之不断提高,完全靠读源代码来寻找bug的方法已经很难适应今天的软件发展形势,也不切实际,所以必须学会调试
(2)调试可以帮助程序员提高编写代码 的能力。因为调试可以让程序员彻底了解程序的实际执行过程,调试过程可以让程序员更好的认识到提高代码可调试性和代码质量的重要性,从此 , 自觉的改进编码方式。
编码与调试应相互结合,才能真正提高软件开发的效率

在这里插入图片描述

 

本文收录于水火莲花-C疑难专题           C语言学习专题​​​​​​

这两个专题可用于正在学习C语言,并且有一定基础的人,专栏持续免费更新中...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555410.html

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

相关文章

CryoEM - 冷冻电镜 CryoSPARC 软件的安装与环境配置

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/130809095 CryoSPARC 软件是一种用于冷冻电镜数据处理的创新工具,可以快速、准确地重建生物分子的三维结构。CryoSPARC 软件…

【使用ChatGPT制作PPT】

内容目录 一、利用ChatGPT生成PPT内容1. 打开ChatGPT:2. 输入需求:3. 复制: 二、制作生成PPT1. 打开PPT制作网站:2. 左侧网页版-导入创建-粘贴Markdown内容-导入创建3. 自行更改副标题、演讲者、选择模板、演示及下载 一、利用Cha…

Linux网络——shell编程之iptables防火墙

Linux网络——shell编程之iptables防火墙 一、概述1.iptables2.netfilter 和 iptables的关系 二、iptables中的四表五链1.四表五链的关系2.四表3.五链 三、匹配顺序1.数据包到达防火墙的匹配流程2.规则链之间的匹配顺序3.规则链内的匹配顺序 四、iptables 防火墙的配置方法1.ip…

python tesseract-ocr + jTessBoxEditorFX 训练自定义字库

在使用tesseract-ocr进行字符识别时,我们使用了官方提供的字库,例如英文字库、中文字库,但这些字库并不一定能满足我们所有的需求。所以有些时候,我们就需要训练属于自己的自定义字库。废话少说,直接开干。 第一步&am…

联想首次展示全栈算力方案服务,品牌换新亮相

1、联想算力,第一次真正被所有人感知。 2、基于软硬服一体化的优势,联想打造了丰富多样的四维算力服务,即融合化、场景化、订阅化、绿色化,可以满足不同企业、不同行业的定制化需求。 5月20日,主题为“联想方案服务&am…

2023中兴软件类笔试

1.下列Python代码:将近似输出什么? import numpy as np print np.sqrt(6*np.sum(1/np.arange(1,1000000, dtypenp.float)**2))这段代码是用来计算圆周率的巴塞尔问题(Basel problem)的近似值,输出结果将近似为3.14159…

使用SMTP协议发送邮件

剧情介绍 今天心血来潮,学了一下Python3,里面有个章节是发送邮件,用示例里面的代码,运行后报错,然后记录一下问题是如何解决的,大家可以看一下,可以有效避坑。 SMTP协议介绍 SMTP&#xff08…

Mysql数据库备份 一天一次 保存最新五天 每天凌晨三点备份

Mysql数据库备份 一天一次 保存最新五天 每天凌晨一点三十备份 步骤一 先查看 sudo systemctl status crond 是否存在 不存在执行下面代码 sudo yum install cronie sudo systemctl start crond sudo systemctl enable crond sudo systemctl status crond 步骤二 Cd /home …

从零开始 Spring Boot 33:Null-safety

从零开始 Spring Boot 33:Null-safety 图源:简书 (jianshu.com) Null-safety(null安全)实际上是Java这个“古老”语言的历史包袱,很多新的语言(比如go或kotlin)在诞生起就在语言层面提供对null…

软件测试需要学习什么?好学吗?需要学多久?到底是报班好还是自学好?

目录 前言: 【文章的末尾给大家留下了大量的福利哦。】 一:软件测试好学吗?需要学习多久? 二:那么选择软件测试行业有什么优势呢? 三:再来说说大家最关心的——软件测试人员的薪资怎么样? …

Spring : XML配置 JavaBean

文章目录 前言一、xml 加载 Bean 对象总结XML加载Bean对象 前言 跟着大佬走!!!! https://github.com/DerekYRC/mini-spring 提示:以下是本篇文章正文内容,下面案例可供参考 一、xml 加载 Bean 对象 大家先…

【C语言】数组名作函数参数

数组名作函数参数 引例思考例2通用性指针形参和数组形参几点说明 引例 在主函数中输入10个整数,并存入一个一维数组中;然后在被调函数中,将0号元素的值改为原值的10倍;最后在主函数中输出结果。 思路: 若想在被调函数…

10:00进去,10:05就出来了,这问的也太变态了···

从外包出来,没想到死在另一家厂子了。 自从加入这家公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到5月一纸通知,所有人不许加班,薪资直降30%,顿时有吃不起饭的赶脚。 好在有个兄弟内推…

SSM框架-SpringMVC

1. SpringMVC 1.1 Spring与Web环境集成 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的,但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) &…

ActiveMq消息队列

ActiveMq是一种开源的java程序&#xff0c;支持Java消息服务(JMS) 1.1 版本 一、持久化机制 1、KahaDB&#xff1a;5.4及之后版本&#xff0c;默认使用日志文件 activemq.xml默认使用KahaDB持久化存储&#xff0c;默认配置安装路径data目录下 <persistenceAdapter> …

Django框架之模板其他补充

本篇文章是对django框架模板内容的一些补充。包含注释、html转义和csrf内容。 目录 注释 单行注释 多行注释 HTML转义 Escape Safe Autoescape CSRF 防止csrf方式 表单中使用 ajax请求添加 注释 单行注释 语法&#xff1a;{# 注释内容 #} 示例&#xff1a; {# 注…

09 FPGA—利用状态机实现可乐售卖机(附代码)

1. 理论 FPGA 是并行执行的&#xff0c;如果我们想要处理具有前后顺序的事件&#xff0c;就需要引入状态机。举个例子&#xff0c;将人看成 FPGA ,我们可以在散步的时候听歌和聊天这是并行执行的&#xff0c;但一天的行程安排却是以时间段前后执行的。 状态机简写为 FSM&#…

java前后端分离有详细内容吗?

微服务架构java前后端分离都有哪些具体内容&#xff1f;目前&#xff0c;有不少客户朋友经常询问我们类似的问题。其实&#xff0c;在新的经济发展形势下&#xff0c;提质增效的低代码开发平台微服务架构早已成为不少新老客户的选择&#xff0c;它们不仅能提高办公协作效率&…

成为更优秀的项目经理:快速提升影响力的六大原则与独门秘笈

在很多公司的组织架构中&#xff0c;项目经理并不是一个常规的职能岗位&#xff0c;项目组是为了某个项目目标临时组建的团队&#xff01; 这就造成了PM一个很尴尬的处境&#xff0c;权、责、利不匹配&#xff0c;也就是有责无权&#xff1a;PM既要对项目目标的实现负责&#…

K8S内容分发网络之集群,nginx,负载均衡,防火墙

目录 第一章.实验架构需求 第二章.实验环境准备 2.1.节点准备 2.2.环境准备 2.3.在master&#xff0c;node01&#xff0c;node02上操作安装docker 2.4.所有节点安装kubeadm&#xff0c;kubelet和kubectl 2.5.部署K8S集群 2.6.在master节点操作 2.7.所有节点部署网络插件…