一、什么是bug
Bug一词的原意是“昆虫”或“虫子”;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。
“Bug”的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字,正是由赫柏所取的。1947年9月9日,赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以在报告中,赫柏用胶条贴上飞蛾,并把“bug”来表示“一个在电脑程序里的错误”,“Bug”这个说法一直沿用到今天。
二、什么是调试及调试的重要性
1、什么是调试
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有愧, 就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。
顺着这条途径顺流而下就是犯罪,逆流而上,就是真相。而调试的过程就是追寻真想的过程。
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序 错误的一个过程。
2、调试的基本步骤
你们平时都是怎样写代码的呢?
很显然,上面的这种迷信调试、阳寿调试法是不对的,我们应该用科学的方法进行调试,那么科学的调试步骤是怎样的呢?
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
3、Debug和Release的介绍
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优 的,以便用户很好地使
注意:当我们把程序从Debug版本改为Release版本时,需要将程序在release版本下重新编译链接一次,才会生成release版本下的.exe文件。
其实,release不仅可以优化内存和运行速度,在一些情况下还可以避免程序死循环,例如下面这段代码:
#include <stdio.h> int main() { int i = 0; int arr[10] = {0}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }
在Debug版本下,这段代码会陷入死循环:
而在Release版本下,程序则不会陷入死循环:
注意:上面这段代码在Debug下出现死循环是VS2019编译器下的一种巧合(与栈区的使用习惯、数组的特点、函数栈帧有关),在其他的编译器或者其他的VS版本下不一定会出现死循环,这里只是利用这种巧合来说明Release版本的特点。
三、Windows下VS常用调试快捷键
F5: 启动调试,经常用来直接跳到下一个断点处。
F9: 创建断点和取消断点的重要作用,可以在程序的任意位置设置断点。 这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10: 逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
F11: 逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL + F5: 开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。
四、VS常用调试技巧
1、查看临时变量的值
F10进入调试状态 -> 调试 -> 窗口 -> 自动窗口/监视。
注意:自动窗口和监视都能观察局部变量的信息,二者的区别在于:自动窗口会自动显示所有局部变量的信息(不管你是否需要),监视需要程序员手动输入(想观察谁就输入谁);对于编程小白建议使用自动窗口,但是对于有一定基础的编程人员还是建议使用监视。
2、查看内存信息
F10进入调试状态 -> 调试 -> 窗口 ->内存。
3、查看调用堆栈
F10进入调试状态 -> 调试 -> 窗口 ->调用堆栈。
4、查看反汇编
F10进入调试状态 -> 调试 -> 窗口 ->反汇编。
5、查看寄存器
如果想了解更多反汇编和寄存器相关的知识,可以看看我写的另一篇文章: 程序员内功心法之函数栈帧的创建和销毁
五、如何写出好(易于调试)的代码
对于我们程序员来说,在程序发生错误时我们要能够熟练的进行调试,但是我们更应该学会如何写出高质量的代码,减少我们程序发生错误的概率。
1、什么是高质量的代码
- 代码运行正常
- bug很少
- 效率高
- 可读性高
- 可维护性高
- 注释清晰
- 文档齐全
关于高质量代码风格的养成这方面我强烈建议大家阅读一下这篇文章:如何写出高质量的代码 – 给所有编程学习者的一个建议,里面对代码的命名、空格、缩进等方面都有详细的介绍,文章最后还可以领取免费的电子版书籍。
2、常见的代码技巧
- 使用assert
- 尽量使用const
- 养成良好的编码风格
- 添加必要的注释
- 避免编码的陷阱
3、优秀代码示范
示例1:模拟实现strlen函数:
普通程序员写的:5分代码
优秀程序员写的:8分代码
大佬写的:10分代码
示例2:模拟实现strcpy函数:
普通程序员写的:5分代码
优秀程序员写的:8分代码
大佬写的:10分代码
如果有不会使用const关键字的同学可以阅读这篇文章: C语言关键字详解(四)带你全面了解 const 关键字
6、编程中常见的错误
1、编译型错误
一般是C语言基本语法方面的错误,比如中英文符号用错的问题,这类错误直接看错误提示信息,然后可以双击错误提示跳转到发生错误的地方,就基本能解决问题,或者凭借经验就可以搞定,相对来说简单。
2、链接型错误
一般是调用函数时(包括自定义函数和库函数)函数名写错造成,我们可以复制错误信息,通过ctrl+f快捷键进行搜索定位即可解决。
3、运行时错误
这类错误一般都是由于数组越界、函数递归时栈溢出类似原因造成的,这类错误最不易改正和发现,它需要我们逐步调试来定位错误,然后分析错误发生的原因,最后改正。
最后希望大家都能做一个有心人,积累排错经验,写出优秀的代码。