文章目录
- 一、什么是bug
- 二、什么是调试及调试的重要性
- 1、什么是调试
- 2、调试的基本步骤
- 3、Debug和Release的介绍
- 三、Windows下VS常用调试快捷键
- 四、VS常用调试技巧
- 1、查看临时变量的值
- 2、查看内存信息
- 3、查看调用堆栈
- 4、查看反汇编
- 5、查看寄存器
- 五、如何写出好(易于调试)的代码
- 1、什么是高质量的代码
- 2、常见的代码技巧
- 3、优秀代码示范
- 6、编程中常见的错误
- 1、编译型错误
- 2、链接型错误
- 3、运行时错误
一、什么是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 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快捷键?点我
四、VS常用调试技巧
1、查看临时变量的值
F10进入调试状态 -> 调试 -> 窗口 -> 自动窗口/监视。
注意:自动窗口和监视都能观察局部变量的信息,二者的区别在于:自动窗口会自动显示所有局部变量的信息(不管你是否需要),监视需要程序员手动输入(想观察谁就输入谁);对于编程小白建议使用自动窗口,但是对于有一定基础的编程人员还是建议使用监视。
2、查看内存信息
F10进入调试状态 -> 调试 -> 窗口 ->内存。
3、查看调用堆栈
F10进入调试状态 -> 调试 -> 窗口 ->调用堆栈。
4、查看反汇编
F10进入调试状态 -> 调试 -> 窗口 ->反汇编。
5、查看寄存器
如果想了解更多反汇编和寄存器相关的知识,可以看看我写的另一篇文章:
优秀程序员写的:8分代码
大佬写的:10分代码
示例2:模拟实现strcpy函数:
普通程序员写的:5分代码
优秀程序员写的:8分代码
大佬写的:10分代码
如果有不会使用const关键字的同学可以阅读这篇文章:
2、链接型错误
一般是调用函数时(包括自定义函数和库函数)函数名写错造成,我们可以复制错误信息,通过ctrl+f快捷键进行搜索定位即可解决。
3、运行时错误
这类错误一般都是由于数组越界、函数递归时栈溢出类似原因造成的,这类错误最不易改正和发现,它需要我们逐步调试来定位错误,然后分析错误发生的原因,最后改正。
最后希望大家都能做一个有心人,积累排错经验,写出优秀的代码。