1.什么是Bug?
Bug的创始人格蕾丝·赫柏(Grace Murray Hopper),是一位为美国海军工作的电脑专家,也是最早将人类语言融入到电脑程序的人之一。而代表电脑程序出错的“bug” 这名字,正是由赫柏所取的。
1945年9月9日,下午三点。哈珀中尉正领着她的小组构造一个称为“马克二型”的计算机。这还不是一个完全的电子计算机,它使用了大量的继电器,一种电子机械装置。第二次世界大战还没有结束。哈珀的小组日以继夜地工作。机房是一间第一次世界大战时建造的老建筑。那是一个炎热的夏天,房间没有空调,所有窗户都敞开散热。
突然,马克二型死机了。技术人员试了很多办法,最后定位到第70号继电器出错。哈珀观察这个出错的继电器,发现一只飞蛾躺在中间,已经被继电器打死。她小心地用摄子将蛾子夹出来,用透明胶布贴到“事件记录本”中,并注明“第一个发现虫子的实例。”
从此以后,人们将计算机错误戏称为虫子(bug),而把找寻错误的工作称为(debug)。
2.调试是什么
2.1 调试是什么
调试 (英语: Debugging / Debug ),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.2 调试的基本过程
- 发现程序错误的存在
- 以隔离、消除等方式对错误进行定位
- 确定错误产生的原因
- 提出纠正错误的解决办法
- 对程序错误予以改正,重新测试
2.3 Debug和Release的介绍
Debug 通常称为调试版本 ,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release 称为发布版本 ,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
3.Windows环境下VS调试技巧
3.1 调试环境准备
在Windows下,VS作为开发环境选择Debug,代码才可以进行调试
在Linux下,开发环境调试工具是gdb,
3.2 VS常用快捷键
以下快捷键为VS常用快捷键,只需掌握以下快捷键,就可以实现大部分调试
F5启动调试,经常用来直接跳到下一个断点处。F9创建断点和取消断点断点 的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。F10逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。F11逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑 进入函数内部CTRL + F5开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用。SHIFT + F11启动循环停止循环直接使用“Shift+F11”即可跳出当前循环
3.3 调试时监视相关信息
监视变量的值
- 以下监视操作需要先F5进行调试后再进行监视
- 可以在监视窗口中输入需要监视的变量进行监视
- 同时也可以监视数组的变换
监视数组
查看内存信息
查看调用堆栈
查看汇编信息
查看寄存器信息
4.常见的编译错误
- 编译型错误 直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。
- 链接型错误 看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不 存在或者拼写错误。
- 运行时错误 借助调试,逐步定位问题。最难搞。
5. 调试实例分析
实现代码:求 1 ! +2 ! +3 ! ...+ n! ;不考虑溢出
int main() {
int i = 0;
int sum = 0;//保存最终结果
int n = 0;
int ret = 1;//保存n的阶乘
scanf("%d", & n);
for (i = 1; i <= n; i++) {
int j = 0;
for (j = 1; j <= i; j++) {
ret *= j;
}
sum += ret;
}
printf("%d\n", sum);
return 0;
}
在输入3时,输出结果应该为9,但是实际输出15
这时候可以通过调试找出问题
先在12行处打上断点,可通过点击左侧或者F9实现,在F5进入调试。
开始调试后,可以在监视页面加入需要监视的变量,之后F11逐句调试
注意:遇到scanf时会自动打开控制台,需要手动输入值后才可以进行调试
经过调试发现ret的值出现问题
由于每次求阶乘时,没有对ret的值进行初始化,因此ret将继承前一次阶乘的值,导致程序出现bug
1!+ 2!+ 3!变为 1! + 2!*1!+ 3!*(2!*1!)
在进行如下修改后程序正常运行