C语言初阶:十一.代码调试技巧

❤欢迎各位大佬访问:折枝寄北-CSDN博客折枝寄北擅长C语言初阶,等方面的知识,折枝寄北关注python,c++,java,qt,c语言领域.https://blog.csdn.net/2303_80170533?type=blog
❤文章所属专栏icon-default.png?t=O83Ahttps://blog.csdn.net/2303_80170533/category_12794764.html?spm=1001.2014.3001.5482

前言:

  在C语言编程的初阶阶段,代码调试是一项至关重要的技能。无论是初学者还是经验丰富的程序员,都会遇到代码无法按预期运行的情况。这时,掌握一些有效的调试技巧能够显著提高问题解决效率,使编程过程更加顺畅。

  代码调试技巧涵盖了从基本的语法错误检查到复杂的逻辑问题排查。这包括使用调试工具(如GDB)、添加调试信息(如打印语句)、设置断点、单步执行代码、检查变量值以及内存分配等。通过这些方法,开发者可以逐步缩小问题范围,定位并修复代码中的错误。

  掌握良好的代码编写习惯,如模块化设计、清晰的变量命名和合理的注释,也能在调试过程中起到事半功倍的效果。这些习惯不仅有助于自己理解代码,还能让他人在需要时快速上手并协助调试。

1.什么是bug?

bug的来由(文心一言提供的解答)

  1. 昆虫起源:在计算机科学中,“bug”一词最初是指实际上的昆虫。在计算机发展的早期阶段,如电子管计算机和晶体管计算机时期,计算机的物理结构相对庞大且复杂,机器内部布满了错综复杂的电路和线路。这些环境很容易吸引各种昆虫,尤其是像蟑螂、蜘蛛等小昆虫。这些小昆虫有时会爬到电路板上,造成短路或断路,从而导致计算机出现故障。因此,工程师们开始用“bug”来形象地描述这种由昆虫引起的计算机故障。

  2. 历史记录:据说,在1945年9月9日,美国哈佛大学的Grace Hopper(格蕾丝·霍珀)博士在调试Mark II计算机时,发现了一只死蛾子(moth)卡在继电器触点之间,从而导致了计算机故障。她将这个蛾子用胶带粘在日志本上,并标注了“First actual case of bug being found”(第一个发现的实际bug案例)。这一事件被广泛认为是“bug”一词在计算机领域中的起源。

2.调试的作用

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

 调试的步骤

发现程序错误的存在

以隔离、消除等方式对错误进行定位

确定错误产生的原因

提出纠正错误的解决办法

对程序错误予以改正,重新测试

3.debug和release的介绍

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。 Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使用。

int main()
{int n = 0;int a = 0;scanf("%d %d", &a, &n);//2 5//计算int sum = 0;int i = 0;int k = 0;for (i = 0; i < n; i++){k = k * 10 + a;sum += k;}//打印printf("%d\n", sum);return 0;
}

上述代码在Debug环境的结果展示:

上述代码在Release环境的结果展示:

所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。

4.windows环境调试介绍

4.1   调试环境的准备

调试代码,要选择在Debug环境下进行

4.2  学会使用快捷键

按f10就进入了调试,在上方图片中我们可以看见如何进行调试查看相应的变量及运行步骤

最常使用的几个快捷键:

F5 启动调试,经常用来直接跳到下一个断点处。

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

F10 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

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

CTRL + F5 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。

CTRL+F可以进行查询文件中的变量名等

4.3  调试的时候查看程序当前信息

查看临时变量的值 在调试开始之后,用于观察变量的值。

5.如何写出好的代码(易于调试)

1. 代码运行正常 2. bug很少 3. 效率高 4. 可读性高 5. 可维护性高 6. 注释清晰 7. 文档齐全

1. 使用assert()//断言

2. 尽量使用const

3. 养成良好的编码风格

4. 添加必要的注释

5. 避免编码的陷阱。

//实现库函数strlen--求字符串长度
unsigned int  my_strlen(const char * str)
{int count = 0;assert(str != NULL);while (*str++ != '\0'){count++;}return count;
}
int main()
{char arr[] = "abcdef";printf("%d\n", my_strlen(arr));return 0;
}

注意:

1. 分析参数的设计(命名,类型),返回值类型的设计

2.野指针,空指针危害

3. assert的使用,assert的作用

4. 参数部分 const 的使用

void my_strcpy(char* dest, char* src)
{//if (src == NULL || dest == NULL)//防止空指针//{//	return;//}//断言//assert中可以放一个表达式,表达式的结果为假就会报错//如果为真,什么事都不会发生//assert在release版本中优化了/*assert(src != NULL);assert(dest!= NULL);*/assert(src && dest);while (*dest++ = *src++)//  \0的ASCII码值为0,while循环判断为假,停止{;}
}
//const修改指针变量的时候
//1.const放在*的左边,修饰的是指针指向的内容,表示指针指向的内容,不能通过指针改变了
//const int* p=&num;
//  
//2.const放在*的右边,const修饰的是指针变量本身,
// 表示指针变量本身的内容不能改变,但是指针指向的内容不能改变
//int* const p=&num;
//int main()
//{
//	/*const int num = 10;
//	const int* p = &num;
//	*p = 20;*/
//	//printf("%d\n", num);
//
//	return 0;
//}

6.编程常见的错误

1 编译型错误 直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

2 链接型错误 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不 存在或者拼写错误。

3 运行时错误 借助调试,逐步定位问题。最难搞。

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

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

相关文章

什么是aps排产管理软件?aps排产管理软件有什么用?最详细解释!

近几年&#xff0c;APS排产管理软件特别火&#xff0c;很多制造业企业都在谈论和使用它。不过&#xff0c;因为信息太多太杂&#xff0c;我们平时接收到的往往都是零零碎碎的介绍&#xff0c;很难全面了解它。所以&#xff0c;今天这篇文章就来给大家做个整合&#xff0c;把APS…

微信小程序25__实现卡片变换

先看效果图 实现代码如下&#xff1a; <view class"page" style"filter:hue-rotate({{rotation}}deg)"><view class"prev" catchtap"toPrev">《《《</view><view class"next" catchtap"toNext&q…

vue项目中如何在路由变化时增加一个进度条

在 Vue.js 项目中&#xff0c;使用路由&#xff08;如 Vue Router&#xff09;时&#xff0c;为了提升用户体验&#xff0c;你可能会想要在路由变化时显示一个进度条。这可以通过多种方式实现&#xff0c;其中一种流行的做法是使用第三方库&#xff0c;如 vue-loading-bar 或 n…

4款专业音频在线剪辑工具帮你开启创意之路。

音频在线剪辑工具能够为我们提供很大的便利&#xff0c;对于不管是专业的音乐制作人还是音频创作爱好者来说&#xff0c;都能借助一些音频编辑工具来充分发挥自己的创意。所以这一次&#xff0c;我要给大家介绍几个专业方便的音频剪辑工具。 1、福昕音频在线 直达链接&#x…

JK触发器(Quartus与Modelsim联合仿真)

JK触发器由于其灵活的逻辑功能&#xff0c;被广泛应用于数字电路设计中&#xff0c;如计数器、寄存器、序列信号发生器等。它可以通过改变J和K的输入来实现不同的逻辑操作&#xff0c;使得设计更加简洁高效。 在数字电子技术中&#xff0c;JK触发器的真值表是理解其工作原理和设…

Redis高频面试题

一、Redis有什么好处? 高性能:Redis是一个基于内存的数据存储系统,相比于传统的基于磁盘的数据库系统,它能够提供更高的读写性能。支持丰富的数据类型:Redis支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,这使得它可以用于多种不同的应用场景。持久化:Re…

Javaweb 实验7 JSP内置对象II实现购物车

实验七 JSP内置对象II 目的&#xff1a; 掌握JSP内置对象的使用。理解JSP的作用域掌握session&#xff0c;application对象的使用 实验要求&#xff1a; 完成实验题目要求提交实验报告&#xff0c;将代码和实验结果页面截图放入报告中 实验过程&#xff1a; 一、结合之前…

Linux随记(十二)

一、redhat6.9 &#xff0c;sftp连接后出现2个connect close 问题描述&#xff1a; 操作系统&#xff1a;redhat 6.9 客户反馈&#xff0c;他们机器sftp连接jxx192.168.1.100后出现connection closed排查过程&#xff1a; 登录192.168.1.100 &#xff08;最开始使用普通用户…

强大的文本编辑器Notepad++8.4.6 最新版

Notepad最新版是一款多功能的代码编辑工具。Notepad官方版支持27种编程语言&#xff0c;涵盖C、C 、Java 、C#,、XML、 HTML,、PHP、python等等&#xff0c;能够帮助程序员提高编辑效率。Notepad软件支持python与sql代码高亮功能&#xff0c;并且免费开源&#xff0c;能够完美地…

【测试平台】打包 子节点android环境配置

背景 本文记录不是安卓Gradle打包&#xff0c;因为我们google play提审&#xff0c;为了规避跟下架包的相似度避免马甲包封号&#xff0c;使用混淆逻辑。 打包环境部署 申请对应虚拟机会有两个账号root和admin&#xff0c;主要避免root账号权限过高造成脚本误操作。这里面问题…

免杀对抗—DLL劫持白加黑隐写分离EDRSyscall-hook

前言 今天讲点比较高端的东西—DLL反射注入&#xff0c;首先什么是DLL文件&#xff0c;简答来说就是程序为了实现某个功能而调用的文件。举个例子&#xff0c;某个代码想要实现某个功能是不是会调用一些封装好的函数&#xff0c;exe同样如此&#xff0c;想要实现某个功能就会调…

uniapp推送配置流程

Dcloud Dcloud注册账号 个推 了解即可 注册个推账号 ios配置流程 需配置含有推送的描述文件以及p8证书 配置推送证书 ios证书配置报技术错误&#xff08;参数错误&#xff09; TeamID-苹果开发者账号唯一的ID 安卓需配置多厂商 小米手机需要配置小米厂商 华为手机则需…

zookeeper全系列学习之分布式锁实现

文章目录 前言一、分布式锁的通用实现思路二、ZK实现分布式锁的思路三、ZK实现分布式锁的编码实现1、核心工具类实现2、测试代码编写线程安全问题复现使用上面封装的ZkLockHelper实现的分布式锁 优点缺点 总结 前言 就像上篇文章zookeeper全系列学习之统一配置获取说的&#x…

Uni-App-02

条件编译 条件编译概念 不同的运行平台终归有些专有的特性&#xff0c;无法实现跨平台完全兼容&#xff0c;例如&#xff1a;微信小程序导航栏右上角的关闭图标。 uni-app提供了一种“条件编译”机制&#xff0c;可以针对特定的平台编译执行特定的代码&#xff0c;否则不执行。…

【ArcGISPro】制作简单的ArcGISPro-AI助手

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_ai大模型流式输出效果(打字效果) python-CSDN博客 【C#】调用本机AI大模型流式返回_怎么实现调用本地大模型时实现流式输出-CSDN博客 【ArcGISPro】宣布推…

springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38819)

刚解决Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;没几天&#xff0c;又来一个新的&#xff0c;真是哭笑不得啊。 springboot 修复 Spring Framework 特定条件下目录遍历漏洞&#xff08;CVE-2024-38816&#xff09;https://blog.csdn.ne…

可编辑97页PPT | 制造企业数字化转型战略咨询及IT总体规划方案

荐言分享&#xff1a;制造企业数字化转型是当前市场环境下的必然趋势&#xff0c;旨在通过引入先进的信息技术&#xff0c;优化业务流程&#xff0c;提升运营效率&#xff0c;增强客户体验&#xff0c;实现可持续发展。这一转型过程涉及多个方面&#xff0c;需要综合考虑企业战…

计算机视觉中的点算子:从零开始构建

Hey小伙伴们&#xff01;今天我们要聊的是一个非常基础但极其重要的计算机视觉技术——点算子&#xff08;Point Operators&#xff09;。点算子主要用于对图像的每个像素进行独立的处理&#xff0c;比如亮度调整、对比度增强、灰度化等。通过这些简单的操作&#xff0c;我们可…

001-Kotlin界面开发之Jetpack Compose Desktop学习路径

Compose Desktop学习之路 学习过程 理解Kotlin的基本语法 Compose Desktop采用Kotlin构建&#xff0c;因此对Kotlin的基本语法有很好的理解是必不可少的。你可以从官方的Kotlin文档开始。 用一句话概括&#xff0c;Kotlin是一种现代的、静态类型的编程语言&#xff0c;它结合…

小金标认证的头戴式蓝牙,QCY H3 Pro耳机,平价高音质的新选择

我发现如今市面上百元级的头戴式无线耳机都有非常出色的音质表现了&#xff0c;这其中国产品牌的表现尤为亮眼&#xff0c;与入耳式耳机相比&#xff0c;头戴式耳机拥有更大的发音单元和更包裹耳朵的耳罩设计&#xff0c;提供了更舒适稳固的佩戴体验&#xff0c;在音质和降噪效…