如何让bug远离你?

news2024/11/17 21:37:57

        想让bug远离你,当然是靠佛祖保佑~ 

/*
 * **************************************************************************
 * ********************                                  ********************
 * ********************      COPYRIGHT INFORMATION       ********************
 * ********************                                  ********************
 * **************************************************************************
 *                                                                          *
 *                                   _oo8oo_                                *
 *                                  o8888888o                               *
 *                                  88" . "88                               *
 *                                  (| -_- |)                               *
 *                                  0\  =  /0                               *
 *                                ___/'==='\___                             *
 *                              .' \\|     |// '.                           *
 *                             / \\|||  :  |||// \                          *
 *                            / _||||| -:- |||||_ \                         *
 *                           |   | \\\  -  /// |   |                        *
 *                           | \_|  ''\---/''  |_/ |                        *
 *                           \  .-\__  '-'  __/-.  /                        *
 *                         ___'. .'  /--.--\  '. .'___                      *
 *                      ."" '<  '.___\_<|>_/___.'  >' "".                   *
 *                     | | :  `- \`.:`\ _ /`:.`/ -`  : | |                  *
 *                     \  \ `-.   \_ __\ /__ _/   .-` /  /                  *
 *                 =====`-.____`.___ \_____/ ___.`____.-`=====              *
 *                                   `=---=`                                *
 * **************************************************************************
 * ********************                                  ********************
 * ********************      				             ********************
 * ********************         佛祖保佑 永远无BUG        ********************
 * ********************                                  ********************
 * **************************************************************************
 */

本文完~


咳咳,直接开始开始正文~


本文的结构:

        O,前言

        一,什么是bug

        二,什么是Debug

        三,通用编译器的Debug

                (1)打印输出

                (2)单步调试

                (3)设置断点

                (4)监视与内存观察

                (5)设置断言

        四,编译习惯很重要

                (0)从内存的视角写代码

                (1)函数的高内聚低耦合

                (2)要写注释

                (3)适当留白

        五,想要告诉你

 O,前言

        1.本文衔接栏目错误经验分享专栏的内容(开篇文章附在文末)

        2.我们知道,编码时常见的错误有编译型错误,链接型错误,运行时错误等。本文的重点是运行时错误——具体说——你写出的代码并不能达到你想要的效果,但是你也不知道错在哪里。

        3.Debug是我们知道有错误之后采取的行动,为了使程序达到预测的运行目标,我们不得不寻找自己写出的bug,但是这通常会花费很长的时间。如果我们可以在从源头上减少bug的产生,少写一些bug,或者不要为自己将来Debug设置那么多的障碍,那么这在无形之中节约了我们的时间,提高了效率。

        

 一,什么是bug?

        bug本意是“昆虫”或“虫子”,现在—般是指在电脑系统或程序中,隐藏着的一些未被发现的
缺陷或问题,简称程序漏洞。

        "Bug”的创始人格蕾丝·赫柏(Grace Murray Hopper),1947年9月9日,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,电脑突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有只飞蛾,这显然是由干飞峨受光和热的吸引,飞到了触点上,然后被高电压击死了。

        所以在报告中,赫柏用胶条贴上飞蛾,并把“bug”来表示“一个在电脑程序里的错误”。        于是,“Bug'这个说法一直沿用到今天。

二,什么是Debug

         De- 是减少,消灭;调试的过程被称为Debug(消灭bug)。

         可以通过隔离和屏蔽代码来大体定位问题,确定错误的原因,再修复代码,重新测试。

         Debug也是一个版本,与它相对的是Release版本,两个版本各有不同的区别:

 区别:

Debug内存占用较大,包含调试信息,相对于Release版本不做优化;

Release版本不含调试信息,由于做了相关优化,内存占用较小;

三,通用编译器的Debug

1.打印输出

        使用printf函数跟随程序时时输出变量的值

 e.g.1

编写一个程序,使其能根据输入得到符合要求的输出内容。

程序须包含一个函数,该函数能求出一个字符串中最长的单词并输出。

输入

一行可以包含 英文大、小写字母、空格 的字符串。

输出

通过调用函数,输出此字符串中最长的单词。

样例

标准输入
Einstein had been a famous physicist after then but he still wore the same old overcoat
标准输出
physicist

 理解一下题,我们直接看代码:

#include<stdio.h>
int main()
{
	char arr[50][50] = { 0 };
	int brr[50] = { 0 };
	int j = 0, p;
	char ch;
	
	for (;;)
	{
		p = 0;
		for (; (ch = getchar()) != '\n';)
		{
			
			if (ch != ' ')//如果不是‘ ’则继续读取
			{
				arr[j][p] = ch;
				p++;
			}
			if ((ch) == ' ')//如果是‘ ’则换到j的下一行
			{
				arr[j][p] = 0;
				brr[j] = p;//(计数)
				j++;
				p = 0;
			}
		}
		if ((ch) == '\n')
		{ 
			brr[j] = p;
			break; 
		}
	}
	int tem = 0, k = 0;
	for (; k < 50; k++)//找到最长字符串的长度
	{
		if (tem < brr[k])
		{
			tem = brr[k];
		}
	}
	
	int m = 0;
	for (; m < 50; m++)
	{
		printf("%d\n",m);//时时输出m,查看第几个字符串是最长字符串
		if (brr[m] == tem)
		{
			break;
		}
	}//找到最长字符串对应的行数j
	
	
	printf("%s\n", arr[m]);
	
	return 0;
}

        在最后一个for循环中,m用来记录是第几个字符串,用printf持续输出m,当m为5时,m == tem 即前面找到的最长字符串的行数。

         于是,这段代码是题目的一种解法。

2.单步调试

        在一些程序运行时,我们会看到报错信息,但是我们并不知道具体哪里出了错,这时候,我们能通过单步调试来定位出错的位置

比如这些代码,当我们运行这段代码后,发现程序挂了,但是不知道具体哪一行出现了问题

e.g.2——当我们运行时,发现程序死循环了,但是由于在实际情况中,代码项目往往很复杂,我们一般无法直接目测处错误之处。

#include<stdio.h>
int main()
{
	printf("haha\n");
	main();
	
	return 0;
}

e.g.3——当程序运行时,我们得知程序发生了数组越界,但是我们并不知道具体是哪一行代码导致发生了数组越界(因为我们必须找到代码,才能修改,改进代码)


int main()
{

	char arr[10];
	scanf("%s", arr);
	return 0;
}

这时候是时候让单步调试出场解决问题了:

e.g.2解

当程序运行到main()时,再次按f10

 程序就崩溃了

 ——得出结论:在第6行出现了问题

e.g.3解

 当程序运行到scanf()后,再次按f10,程序报错

 ——得出结论:scanf()函数读入数据过多导致数组越界了

 3.设置断点

        在VS2019,我们用鼠标单击左侧的代码行的标号,就会出现一个红色的原点,这就是断点

 设置断点:

        鼠标单击代码行左侧的竖行,会出现断点;(再次单击取消断点)

        将输入标稳定在要打断点的行,按f9,也会出现断点。(再次按f9取消设置)

使用断点:

        断点与f5配合使用,每按一次f5程序会跳到逻辑上的下一个断点。

 4.监视与内存观察

当我们调试的时候,我们想更直观的观察变量的值的变化过程,这时候我们可以打开监视

在按f10进入调试状态,注意是在调试状态下,我们在如图所示的窗口中,找到监视窗口:

 (四个监视窗口都是可以使用的,第一次使用的话,可以随便选一个)

 在监视窗口中,我们可以随时监视变量的变化过程:

内存窗口:

按图寻找,即可找到内存窗口

 通过内存窗口,我们可以看到函数内变量在内存中的创建与销毁(附在文末)

因为之前分享过,在这里不再详细展开。 

5.设置断言

assert()函数,用于在调试过程中捕捉程序错误

e.g.4——模拟实现strcpy()函数

我们不希望传入的p1,p2是空指针,对空指针解引用是很危险的!所以我们在此处使用断言assert,两个指针不是空指针


#include<stdio.h>
#include<assert.h>
void my_strcpy(char* p1,const char* p2)
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	while(*p1++ = *p2++)
	{
		;
	}
}
int main()
{
	char str1[20] = "xxxxxxxxxxxxxx";
	char str2[] = "hello";

	my_strcpy(str1,str2);

	printf("%s\n", str1);
	printf("%s\n", str2);
	return 0;
}

  (这段代码是非常巧妙的,它生动体现了C语言的紧凑性。)

如果是,那么程序会报出精确的错误信息:

assert()

        所在头文件:<assert.h>

        函数原型:void assert (int expression);

        参数:expression即要检测的表达式

        返回值:无返回值

        assert() 的用法很简单,我们只要传入一个表达式,它会计算这个表达式的结果:如果表达式的结果为“假”,assert() 会打印出断言失败的信息,并调用 abort() 函数终止程序的执行;如果表达式的结果为“真”,assert() 就什么也不做,程序继续往后执行。

        如果想要禁用这个断言函数,只需将
 
        #define NDEBUG

        定义在在代码的开头,在包含 <assert.h> 之前。

四,编译习惯很重要

 (0)从内存的视角写代码

当我们写代码的时候,我们要有内存意识,看代码是内存,看数组是连续的线性表,如果是局部变量,则创建在栈区,地址先高后低等。

(1)函数的高内聚低耦合

我们写项目,往往需要实现多个功能,这时我们如果把所有的代码写在一起,那么一方面先显得逻辑不清,调试的时候不方便,为自己设置了障碍,另一方面,如果我们又要使用一个函数的某个功能,就又要重新写了。

如果我们将项目封装成一个一个功能不一的函数,在使用的时候调用,这样代码的逻辑性会有很大提高,并且可以减小代码量,提高效率。

(2)要写注释

  1. 解释代码:注释可以用来解释代码的意义和作用,有助于其他开发人员理解你的代码。

  2. 提高代码可读性:注释可以使代码更易读,更具有可读性。通过注释可以使代码更加易于理解,特别是在一些复杂的算法或逻辑代码中。

  3. 方便调试:注释可以用来记录程序的执行流程,这可以帮助错误诊断和调试。

  4. 方便维护:注释可以记录代码的变更历史和维护记录,方便以后维护和修改代码。

  5. 提高代码质量:注释可以强制编写人员思考代码的逻辑,有助于代码的质量提高。

(3)适当留白

        适当的留白可以提升代码的可读性,便于理解。

五,想要告诉你

        最好的Debug就是减少写出的bug,在写程序之前要根据内存的,数据结构的知识对代码的可行性与逻辑性进行估计,在心里构建出自己的想法的实现方法。

        敢于发现并承认自己的错误

        Debug是一个反复迭代的过程,需要不断地尝试和测试,直到找到并解决所有的错误。

加油! 


编译时报错解决icon-default.png?t=N7T8https://blog.csdn.net/2301_79465388/article/details/133919788?spm=1001.2014.3001.5502函数栈帧的创建与销毁icon-default.png?t=N7T8https://blog.csdn.net/2301_79465388/article/details/134256464?spm=1001.2014.3001.5502

 文章回顾


目录

 O,前言

 一,什么是bug?

二,什么是Debug

三,通用编译器的Debug

1.打印输出

2.单步调试

 3.设置断点

 4.监视与内存观察

5.设置断言

四,编译习惯很重要

                (0)从内存的视角写代码

(1)函数的高内聚低耦合

(2)要写注释

(3)适当留白

五,想要告诉你


完~

未经作者同意禁止转载

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

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

相关文章

关于使用Java-JWT的笔记

Token的组成规则 一个token分三部分&#xff0c;按顺序为&#xff1a;头部&#xff08;header)&#xff0c;载荷&#xff08;payload)&#xff0c;签证&#xff08;signature) 由三部分生成token &#xff0c;三部分之间用“.”号做分隔。 例如&#xff1a;“eyJhbGciOiJIUzI1…

java: 无效的目标发行版: 17 问题解决

今天在写完类点击运行后显示java: 无效的目标发行版: 17 网上查询了一番&#xff0c;发现有几个地方需要注意。 还有一个就是设置中&#xff0c;下面的就是我本次问题所在&#xff0c;不知道为什么&#xff0c;他自动添加了下面的东西 一个方法是把目标字节码版本改为正确的&a…

Linux:wget后台下载/查看后台任务进度

1. 后台下载 使用wget -b url&#xff1a; wget -b http://cn.wordpress.org/wordpress-3.1-zh_CN.zip后台任务启动后&#xff0c;会返回两段话&#xff0c;第一段返回一个pid&#xff0c;代表这个后台任务的进程&#xff0c;并且我们可以kill掉这个id来终止此次下载&#x…

听GPT 讲Rust源代码--src/librustdoc(2)

题图来自 Chromium项目将支持Rust编程语言[1] File: rust/src/librustdoc/html/render/search_index.rs 在Rust源代码中&#xff0c;rust/src/librustdoc/html/render/search_index.rs文件的作用是生成搜索索引&#xff0c;用于在Rust文档页面上进行关键字搜索。该文件实现了一…

C语言童年生活二三事(ZZULIOJ1091:童年生活二三事(多实例测试))

题目描述 Redraiment小时候走路喜欢蹦蹦跳跳&#xff0c;他最喜欢在楼梯上跳来跳去。 但年幼的他一次只能走上一阶或者一下子蹦上两阶。 现在一共有N阶台阶&#xff0c;请你计算一下Redraiment从第0阶到第N阶共有几种走法。 输入&#xff1a;输入包括多组数据。 每组数据包括一…

VMware——WindowServer2012R2环境安装mysql5.7.14解压版_互为主从(图解版)

目录 一、服务器信息二、192.168.132.35服务器上安装mysql&#xff08;主&#xff09;2.1、环境变量配置2.2、安装2.2.1、修改配置文件内容2.2.2、初始化mysql并指定超级用户密码2.2.3、安装mysql服务2.2.4、启动mysql服务2.2.5、登录用户管理及密码修改2.2.6、开启远程访问 三…

电力工作记录仪、智能安全帽、智能布控球助力智能电网建设

电力行业的建设和发展是国家经济发展的重要支撑&#xff0c;而智能电网作为电力系统的重要组成部分&#xff0c;它的安全高效运行关乎到整个电力系统乃至民生的稳定和安全。为了加快国家经济的发展以及满足人们对电力的需求和用电可靠性的要求&#xff0c;国家早在十二规划中就…

操作系统(三)| 进程管理上 进程状态 同步 互斥

目录 1 进程和程序区别 2 进程状态 2.1 进程的5种基本状态 2.2 进程状态之间转换 2.3 七状态模型 3 进程描述 3.1 进程控制块 PCB 3.2 进程块组织方式 4 进程控制 5 进程同步 互斥 5.1 区分进程互斥和同步 5.2 核心方案 5.3 其他方案 方案1 设置锁变量 方案2 严…

数据湖的概念、发展背景和价值

数据湖是一个集中化的存储系统&#xff0c;旨在以低成本、大容量的方式&#xff0c;无需预先对数据进行结构化处理&#xff0c;存储各种结构化和非结构化数据。以下是数据湖概念、发展背景和价值的详细介绍。 数据湖概念 数据湖的概念源自于对传统数据仓库的补充。传统数据仓…

AI大爆发的时代,未来的年轻人怎样获得机会和竞争力?

文章目录 引言AI与教育工作者教育资源不平衡 这次&#xff0c;狼真的来了。 引言 AI正迅猛地改变着我们的生活。 根据高盛发布的一份报告&#xff0c;AI有可能取代3亿个全职工作岗位&#xff0c;影响全球18%的工作岗位。在欧美&#xff0c;或许四分之一的工作可以用AI完成。另…

windows排除扫描文件夹

搜索防火墙和网络保护 点击病毒和威胁防护 往下拉&#xff0c;找到排除项 添加排除项

计算机毕业设计 基于SpringBoot的社区物资交易互助平台/系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【计算机网络学习之路】Windows下的socket编程

文章目录 前言Windows下的socket编程1.预备工作2. socket编程 结束语 前言 本系列文章是计算机网络学习的笔记&#xff0c;欢迎大佬们阅读&#xff0c;纠错&#xff0c;分享相关知识。希望可以与你共同进步。 本篇文章仅记录Windows下socket编程和Linux的不同&#xff0c;并没…

Lec15 Crash recovery

xv6文件系统实现分为七层&#xff0c;如图所示 File system logging&#xff08;文件系统日志&#xff09; 日志驻留在超级块中指定的已知固定位置。 它由一个头块&#xff08;header block&#xff09;和一系列更新块的副本&#xff08;logged block&#xff09;组成。头块…

关于Unity Time.deltaTime的理解和使用

Unity中的Time.deltaTime是一个表示上一帧到当前帧所用时间的浮点数。 它可以让Unity应用程序能够以平滑的方式在不同的帧率下运行。 要深刻理解Time.deltaTime&#xff0c;首先得了解Unity引擎得工作原理。 Unity引擎以每秒帧数&#xff08;FPS&#xff09;的形式运行。 比…

STM32:时钟树原理概要

在一般情况下只要在CubeIDE中将RCC下的高速时钟源设置成晶振&#xff0c;随后在时钟配置中把HCLK设置到最大频率&#xff08;比如STM32F103的最高频率是72MHZ &#xff09;&#xff0c;CubeIDE就会帮我们自动调节其它参数到合适的值。这样我们芯片就可以全速运行了。 一、时钟信…

python查找算法_顺序查找

顺序查找&#xff08;Sequential Search&#xff09;是一种简单直观的搜索算法&#xff0c;用于在无序数组中查找特定元素。它的基本思想是逐个遍历数组中的元素&#xff0c;直到找到目标元素或遍历完整个数组。本文将介绍顺序查找的基本原理&#xff0c;并通过Python代码进行详…

基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码

基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于人工大猩猩部队算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于人工大猩猩部队优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&a…

硬盘录像机无法注册到视频监控平台EasyCVR上是什么原因?该如何解决?

视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;也…

【剑指offer|图解|链表】链表的中间结点 + 链表中倒数第k个结点

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;数据结构、算法模板 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️链表的中间结点二. ⛳️链表中倒数第k个结点&#x1f4dd;结语 &#x1f4c…