目录
一、什么是BUG?
程序错误,即英文的Bug,也称为缺陷、臭虫,是指在软件运行中因为程序本身有错误而造成的功能不正常、死机、数据丢失、非正常中断等现象。 早期的计算机由于体积非常庞大,有些小虫子可能会钻入机器内部,造成计算机工作失灵。史上的第一只 "Bug" ,真的是因为一只飞蛾意外走入一电脑而引致故障,因此Bug从原意为臭虫引申为程序错误。 一些有趣的Bug有时也会成为一种乐趣。在电脑游戏中,一些Bug,假如不令游戏出现大错误的话,经常会变成一种玩游戏时的秘技。
二、调试是什么?
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺腾而上,这就是推理的途径
我们可以将调试的过程看作推理 ,那么一名优秀的程序员一定是一名出色的侦探
那么调试是什么呢?
调试又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个应用
调试的基本步骤
1、发现程序错误的存在
2、以隔离、消除等方式对错误进行定位
3、确定错误产生的原因
4、提出纠正错误的解决办法
5、对程序错误予以改正、重新调试
Debug和Realease的介绍
Debug通常被称为调试版本,它包含调试信息,并且不做任何的优化,便于程序员调试程序
Release被称为发行版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便被更好地使用
当我们打开我们的代码所处文件夹时,可以看到上图中的两个文件,其中Debug文件是指调试版本的可执行程序,而Release版本是指发布版本的可执行程序
我们分别打开Debug和Release文件,可以观察到:
在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、必要时,在关键代码旁边添加注释
五、编程常见的错误
编译性错误
直接看错误提示信息(双击),解决问题,或者凭借经验就可以搞定,相对来说较为简单
链接性错误
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是标示符名字不存在或拼写错误
运行时错误
借助调试,逐步定位问题,最难解决
总结
一个好的程序员不仅能够写出优秀的代码,更能够熟练的运用调试功能使代码能够正常地运行