1.什么是bug?
作为程序员,每天被bug支配着,当然应该了解下对手了。
bug原意本来为昆虫的意思,1947年9月9日,葛丽丝·霍普(Grace Hopper)发现了第一个电脑上的bug。当在Mark II计算机上工作时,整个团队都搞不清楚为什么电脑不能正常运作了。经过大家的深度挖掘,发现原来是一只飞蛾意外飞入了一台电脑内部而引起的故障(如图所示)。这个团队把错误解除了,并在日记本中记录下了这一事件。也因此,人们逐渐开始用“bug”来称呼计算机中的隐错。
2.调试是什么?有多重要?
所有发生的事情都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了;如果问心有愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径
顺着这条途径顺流而下就是犯罪,逆流而上就是真相
一名优秀的程序员是一名出色的侦探
每一次尝试都是尝试破案的过程
2.1调试是什么?
调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序
错误的一个过程。
2.2 调试的基本步骤
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
发现程序错误:程序员自己、测试人员、用户
3.debug和release的介绍
- Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序
- Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用
测试人员站在用户的角度,测试的是发布版本
代码:
#include <stdio.h> int main() { char *p = "hello world"; printf("%s\n", p); return 0; }
上述代码在Debug环境的结果展示
上述代码在Release环境的结果展示
Debug和Release反汇编展示对比
所以我们说调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程
那编译器进行了哪些优化呢? 请看如下代码:
#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 模式去编译,程序没有死循环。
那他们之间有什么区别呢?
就是因为优化导致的