如何让bug远离你?

        想让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;}}//找到最长字符串对应的行数jprintf("%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.rhkb.cn/news/200238.html

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

相关文章

09【保姆级】-GO语言的数组和切片

09【保姆级】-GO语言的数组 一、数组1.1 数组定义1.2 数组的使用1.3 数组的遍历1.4 数组的应用案例 二、切片2.1 切片的介绍2.2 切片的原理2.3 切片的三种使用 之前我学过C、Java、Python语言时总结的经验&#xff1a; 先建立整体框架&#xff0c;然后再去抠细节。先Know how&a…

如何使用SD-WAN提升物流供应链网络效率

案例背景 本次分享的物流供应链企业是一家国际性的大型企业&#xff0c;专注于提供全球范围内的物流和供应链解决方案。案例用户在不同国家和地区均设有多个分支机构和办公地点&#xff0c;以支持客户需求和业务运营。 在过去&#xff0c;该企业用户使用传统的MPLS网络来连接各…

基于SDN技术构建多平面业务承载网络

随着企业数字化的浪潮席卷各个行业&#xff0c;传统网络架构面临着更为复杂和多样化的挑战。企业正在寻找一种全面适应数字化需求的网络解决方案。随着软件定义网络&#xff08;SDN&#xff09;的发展&#xff0c;“多业务SDN一张网”解决方案为企业提供了一种全新的网络架构&a…

OpenAI 超 700 名员工联名逼宫董事会;ChatGPT 新功能“阅后即焚”丨 RTE 开发者日报 Vol.89

开发者朋友们大家好&#xff1a; 这里是 「RTE 开发者日报」 &#xff0c;每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE &#xff08;Real Time Engagement&#xff09; 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文…

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

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

【PCB学习】几种接地符号

声明 该图并非原创&#xff0c;原文出处不可考&#xff0c;因此在这里附加说明。 示意图

Rust开发——切片(slice)类型

1、什么是切片 在 Rust 中&#xff0c;切片&#xff08;slice&#xff09;是一种基本类型和序列类型。在 Rust 官方文档中&#xff0c;切片被定义为“对连续序列的动态大小视图”。 但在rust的Github 源码中切片被定义如下&#xff1a; 切片是对一块内存的视图&#xff0c;表…

ICCV 23丨3D-VisTA:用于 3D 视觉和文本对齐的预训练Transformer

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/abs/2308.04352 开源代码&#xff1a;http://3d-vista.github.io 摘要&#xff1a; 3D视觉语言标定&#xff08;3D-VL&#xff09;是一个新兴领域&#xff0c;旨在将…

python查找算法_顺序查找

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

HarmonyOS脚手架:快捷实现ArkTs中json转对象

前言 在上篇《HarmonyOS开发&#xff1a;UI开展前的阶段总结》中提到了未来的规划&#xff0c;既能让大家学会鸿蒙开发&#xff0c;也能让大家在以后的开发中如虎添翼&#xff0c;最终决定&#xff0c;便以脚手架为产出物&#xff0c;结合实际的业务需求&#xff0c;进行相关技…

el-tree结合el-switch实现状态切换

<template><div><el-col :span"24"><el-card class"tree-card"><div class"sketch_content selectFile"><span class"span_title">组织列表 </span><div style"display: flex; jus…

【ARM Trace32(劳特巴赫) 使用介绍 2.3 -- TRACE32 进阶命令之 参数传递介绍】

请阅读【ARM Coresight SoC-400/SoC-600 专栏导读】 文章目录 参数传递命令 ENTRY 参数传递命令 ENTRY ENTRY <parlist>The ENTRY command can be used to Pass parameters to a PRACTICE script or to a subroutineTo return a value from a subroutine 使用示例&am…

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

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

前端入门(二)Vue2到Vue3

文章目录 Vue简介Vue的特点Hello, Vue Vue基本语法模板语法数据绑定&#xff08;v-bind、v-model&#xff09;el与data的两种写法 数据代理实现原理Object.defineProperty()数据代理 事件处理&#xff08;v-on:click / click&#xff09;事件修饰符键盘事件&#xff08;略&…

多项式求和

题目描述 给定程序中 fun 函数的功能是&#xff1a;求出以下分数序列的前 n 项之和&#xff0c;并通过函数值返回 main 函数。 输入格式 输入参数。 输出格式 计算公式返回的结果。 输入输出样例 输入1 5 输出1 8.391667 python解&#xff1a; def fun(n):a1b2s0for…

Jmeter监听器

Jmeter监听器 一、监听器介绍二、监听器的类型三、监听器详解3.1 察看结果树3.2 Summary Report3.3 聚合报告3.4 后端监听器3.5 Aggregate Graph3.6 Comparison Assertion Visualizer&#xff08;比较断言可视化器&#xff09;3.7 JSR223 Listener3.8 Response Time Graph3.9 S…

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

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

Spring Boot单元测试

目录 1.概述 2.基本使用 3.优势 4.常用属性 1.概述 所谓单元测试就是对功能最小粒度的测试&#xff0c;落实到JAVA中就是对单个方法的测试。对单个方法的测试用junit即可&#xff0c;关于junit作者另一位篇文章中有详细介绍&#xff0c;感兴趣的小伙伴可以去看看&#xff…

跳台阶游戏(Python排列组合函数itertools.combinations的应用)

给定台阶总数和两种单次可跳级数&#xff0c;编写自定义函数&#xff0c;计算所有的游戏组合方案数量。 (笔记模板由python脚本于2023年11月19日 19:18:48创建&#xff0c;本篇笔记适合熟悉python自定义函数编写&#xff0c;了解排列组合知识的coder翻阅) 【学习的细节是欢悦的…

Es 拼音搜索无法高亮

目录 背景&#xff1a; Es 版本&#xff1a; 第一步 第二步 &#xff08;错误步骤 - 只是记录过程&#xff09; 第三步 第四步 第五步 第六步 第七步 背景&#xff1a; app 原有的搜索功能无法进行拼音搜索&#xff0c;产品希望可以支持&#xff0c;例如内容中含有&a…