遇到BUG手足无措?还不快进来学习调试小技巧!

目录

一、什么是BUG?

二、调试是什么? 

 调试的基本步骤

 Debug和Realease的介绍

三、调试的具体方法

         调试中的快捷键

查看临时变量的值

         调试的实例

 四、如何写出优秀(易于调试的代码)

常见的coding技巧

 五、编程常见的错误 

        编译性错误

        链接性错误

        运行时错误

总结


一、什么是BUG?

 

        程序错误,即英文的Bug,也称为缺陷臭虫,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。 早期的计算机由于体积非常庞大,有些小虫子可能会钻入机器内部,造成计算机工作失灵。史上的第一只 "Bug" ,真的是因为一只飞蛾意外走入一电脑而引致故障,因此Bug从原意为臭虫引申为程序错误。 一些有趣的Bug有时也会成为一种乐趣。在电脑游戏中,一些Bug,假如不令游戏出现大错误的话,经常会变成一种玩游戏时的秘技。 

二、调试是什么? 

         所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺腾而上,这就是推理的途径

        我们可以将调试的过程看作推理 ,那么一名优秀的程序员一定是一名出色的侦探

        那么调试是什么呢?

调试又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个应用

调试的基本步骤

1、发现程序错误的存在

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

3、确定错误产生的原因

4、提出纠正错误的解决办法

5、对程序错误予以改正、重新调试 

 Debug和Realease的介绍

        Debug通常被称为调试版本,它包含调试信息,并且不做任何的优化,便于程序员调试程序

        Release被称为发行版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便被更好地使用

        当我们打开我们的代码所处文件夹时,可以看到上图中的两个文件,其中Debug文件是指调试版本的可执行程序,而Release版本是指发布版本的可执行程序 

         我们分别打开DebugRelease文件,可以观察到:

                在Debug文件中的exe文件大小有72kb,但是在Release文件中却仅有16kb,这是因为在Release版本中对文件进行了优化,所以文件所占的内存更小了

三、调试的具体方法

在讲调试前,先纠正一个错误的认知:

很多人在编写代码的时候使用的是visual studio,并且会称之为编译器,其实这是不严谨的。

visual studio严格意义上来说,并不是一个编译器,而是IDE(集成开发环境)

一个IDE内包含了编辑器编译器调试器

而对于不同的计算机语言在编写代码的时候使用的IDE也是不同的

对于C语言来说VS 2019以及其它版本的IDE都是大同小异的

 调试中的快捷键

 在了解快捷键之前我们先了解一下调试过程断点的重要性

        在调试的过程中,我们可以在程序的任意位置设置断点

        这样就可以使得程序在自己想要的位置随意停止执行,继而一步一步地执行下去

F5

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

F9

设置断点和取消断点

F10

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

F11

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

CTRL+F5

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

查看临时变量的值

在调试过程中,我们可以通过查看临时变量的值来更好的观察程序运行的全过程

查看临时变量的大致过程为:调试--->窗口--->监视

此时我们要注意:只有先调试才能找到监视

当未开始监视的时候,我们看到的页面是这样的:

 开始监视后的页面是这样的:

 因此,不调试,我们就无法观察到临时变量的变化过程

调试的实例

接下来,我们来看一个很经典的调试案例:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	for (i = 0; i <= 12; i++)
	{
		printf("hehe\n");
		arr[i] = 0;
	}
	return 0;
}

当我们在VS 2019版本中运行此段代码的时候,我们会发现代码运行的结果是一直在输出"hehe"

 

 此时,我们对代码进行调试并观察临时变量的变化过程会发当i<=11时,运行正常,但当i=12时,i和arr[i]均变为0,这是为什么呢?

对代码进行观察,我们会发现这段代码发生了数组越界的错误

局部变量是储存在内存的栈区中的,栈区储存的使用习惯是:

        先使用高地址处的空间,再使用低地址处的空间

而数组在内存中随着数组下标的增加,内存是有低向高变化的,因此当I=12时,i的地址和arr[i]的地址一样,此时数组越界导致了I和arr[i]均被赋值0,最终导致程序出现了死循环

在这幅图中,我们可以准确地看到内存的变化 

 

那么在i和arr数组中,恰好一定是两个整型地空间吗?

答案是不一定,二者之间具体空间的大小差异主要取决于编译器自身 

 四、如何写出优秀(易于调试的代码)

在编写代码的时候,我们可以尽量多的使用一些小技巧使得自己的代码在出现BUG的时候更加易于调试

常见的coding技巧

1、使用assert

2、尽量使用const

3、养成良好的编码风格

4、必要时,在关键代码旁边添加注释

 五、编程常见的错误 

编译性错误

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

链接性错误

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

运行时错误

借助调试,逐步定位问题,最难解决

总结

一个好的程序员不仅能够写出优秀的代码,更能够熟练的运用调试功能使代码能够正常地运行

  • 15
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值