目录
什么是调试?
Debug和Release:
调试方法:
环境准备:
调试快捷键介绍:
调试快捷键注意事项:
监视与内存查看:
数组元素的监视:
编译常见错误归类:
编译型错误:
链接型错误:
运行时错误:
什么是调试?
当我们发现程序中存在问题的时候,那下一步就是找到问题并修复问题。
这个找问题的过程叫做调试,英文叫debug(消灭bug)的意思。
Debug和Release:
Debug版本通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序;同时这样编译产生的是debug版本的可执行程序,其中包含调试信息,是可以直接进行调试的。
Release版本通常称为发布版本,它往往是进行了各种优化,使得小程序在代码大小和运行速度上都是最优的,以便用户很好地使用;它编译产生的是release版本的可执行程序,这个版本是给用户使用的,无需包含调试信息等。
所以,release版本小,debug版本大
调试方法:
环境准备:
首先是环境的准备,需要一个支持调试的开发环境,笔者此处用的是vs2022,应该把vs上设置为Debug,如图
调试快捷键介绍:
如果是无断点的调试,直接按F10即可从主函数开始调试
调试快捷键注意事项:
假设我们给了两个断点,且两个断点都位于循环语句,那么此时我们使用F5能从当前断点处跳到下一断点处吗?
答案是不能,因为断点位于循环语句,因此下一次遇见断点依旧是该断点本身(循环所致),并不能一次性跳出循环
注意:笔记本电脑上这些快捷键都需要配合Fn来使用(例如Fn + F5,效果与F5一样),当然也可以跟着CSDN教程,关闭功能键模式
断点的其他细节:
右击断点,可以看到一个条件标签,点击即可产生条件断点
条件断点的功能:可以在点击条件标签后给该断点上一个条件(就比如此处给了一个条件 i == 5),那么按了F5之后就会直接跳到 i == 5 的这一步(循环语句中的 i == 0,1,2,3,4 就直接跳过了),如下图所示
监视与内存查看:
请注意,无论是监视还是内存查看都需要有一个前提:程序开始调试。在程序没有调试的环境下,调试一栏是没有这两个标签的!
1.监视:监视窗口即是在搜索一栏搜索需要调试的标识符、数组名等等;除了一般性的监视窗口(需要手动输入需要查看的名称),vs2022还自带了自动窗口(无数手动输入,某一个数组或变量经过运算后自动出现在窗口页面)以及局部变量窗口(只有局部变量的窗口,但这边是全部局部变量)。如下所示
2.内存查看:内存查看依旧属于一个窗口,因此也是在 调试-窗口 里查看。
这边我们需要注意的是内存查看窗口,它表示的究竟是什么内容。
在最左边的地址,每个地址单元存放一字节的内容,所以我们也就不难发现下图是以每行18字节显示(自动)
中间部分是内存中的值,内存中本来是2进制的,但由于2进制表示太长,所以为了方便改成了16进制,1个字节的2进制转换成16进制就是两位数字
最右边的是内存的简单解析,但由于这些解析我们压根就看不懂(怪不得叫简单解析),所以直接忽略即可
但这时候我们能不能让每行显示的字节数少一点,让内存查看更加清晰明了呢,点击列那一栏,就可以选一个数字,这个数字(假设为n)即为每行显示n个字节内容
数组元素的监视:
- 数组传参以后的监视:传参以后监视窗口里只会显示数组的首地址元素。并且在未进入函数以前,该元素是一个随机值;进入函数以后,才会将它变成数组的现存元素。
- 二维数组的监视:二维数组如果没有特殊的声明,监视只会显示一行的内容;作为实参传参以后,依然只能显示一行的内容,随机值的规则不变。
- 上述问题的解决:想要看全数组内容,可以通过 数组名,数字 的方式。这边的数字对于情况1即为监视到数组的第几个元素,对情况2即为监视到数组的第几行元素。(如下两图所示)
情况1
情况2
同时,上述情况并不代表必须要让数组所有内容都在监视窗口可视。可以按照我们的需求,对于这个数字有改变。比如下图,我们只展示了一个二维数组的2行元素,但它有3行元素。
编译常见错误归类:
编译型错误:
编译型错误一般性都是语法错误。这类错误一般看错误信息就能找到一些蛛丝马迹的。双击错误信息也能初步的跳转到代码错误的地方或附近。编译错误,随着语言的掌握熟练,会越来越少,也容易解决。
链接型错误:
看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是因为
- 标识符名不存在
- 拼写错误
- 头文件没包含
- 引用的库不存在
运行时错误:
没有语法错误,没有链接错误,程序运行起来了,但结果和想要的不符。
这种错误是最麻烦的,需要通过调试来发现问题,解决问题。