什么是bug?
bug原义为虫子,因为一次计算机的运行故障由一只飞蛾引起,从而在计算机中常用bug来形容程序运行出现问题
常见bug的归类
在编译中,我们将常见的bug分为三类:
- 编译型错误
- 链接型错误
- 运行型错误
编译型错误
编译型错误往往是语法错误,在编译的时候程序就会报错,点击错误便可跳转到错误所在的那一行,同时在VS中错误的地方会有下划线提示,这种错误通常比较好解决
链接型错误
造成编译型错误的原因有以下几种:
- 未包含头文件
- 引用函数名错误
- 引用的函数不存在
未包含头文件
当函数未包含头文件时,就会出现引用头文件中的库函数报错的情况,以printf举例,如图:
LNK表示link,链接的意思
引用函数名错误
如图,原想引用add函数但a大写写成了Add,所以程序出问题了
引用的函数不存在
若Add函数不存在,那么引用Add函数就会报错
运行错误
运行错误指代码可以运行,但运行结果与预期不符,是逻辑上的错误,往往难以被编译器发觉,所以此时我们需要调试来解决问题
什么是调试?
发现问题并解决问题的过程叫调试,英文叫debug(消灭bug)
调试一般有以下手段:
- 逐过程调试
- 隔离或屏蔽代码
- printf调试
逐过程调试:一步一步的运行代码,进行调试
隔离或屏蔽代码:将某一段代码注释掉,运行程序不出错,就代表错误在被注释的代码中
printf调试:利用printf将代码中的数据显化出来,观察出错的数据(一般在刷题库时,用外部编译器进行调试的时候使用)
debug和release
debug:调试版本,包含调试信息,可直接调试(程序员使用)
release:发布版本,在内存,运行速度上进行优化,以便更好地使用,不可直接调试(用户使用)
从内存上可明显看出debug比release内存大,因为debug中存放了调试信息,同时release对其内存进行了优化
我们调试用的是debug版本,当程序质量符合交付标准后才会用release版本
VS调试快捷键
Ctrl+F5:直接运行程序不调试
Fn+F10:逐过程,只在一个函数里执行(直接调用此函数中所用到的其他函数,不跳到其他函数内部)
Fn+F11:逐语句,一条一条语句执行(会进入其他函数内部)
Fn+F9:创造断点,可在程序任意位置设置断点,打上断点可使程序直接跳到想要的位置,接下来用F10,F11快捷键观察执行细节
Fn+F5:直接跳到断点位置,与F9键一起使用(可在函数内部标断点)
注意:如果有多个断点,则是跳到执行逻辑的断点处,而不是物理意义上的下一个断点处
条件断点:满足条件触发断点
创建断点可点击想标段点的语句再使用Fn+F9,也可以使用鼠标点击断点行列标上断点,断点用红点表示,如图:
条件断点则是右键点击红点,找到条件,进行添加,如图:
监视和内存观察
调试-窗口-监视/内存
需要调试起来后才能看到监视和内存
未开始调试前:
开始调试后:
随便点一个监视窗口都可,输入想监测的值,可以在程序运行时监测数值的变化,展示结果如图:
随便点一个内存窗口都可,点后出现窗口如图:
我们可以输入变量的地址或数组的数组名就可以查找到该地址中存放的值:
数组的数组名就代表数组首元素的地址
输入数组arr:
按回车键,就会找到数组对应的地址:
将列数改为4,会得到更简洁的表达