八 、VS的调试技巧

                                                                                                                                     --- 24.4.20

目录

1、什么是Bug?

2、什么是调试(Debug)?

3、Debug和Release

4、VS基础调试快捷键

4.1、环境准备

4.2、调试快捷键

5、监视和内存观察

5.1、监视窗口

5.2、内存窗口

6、调试举例1

7、调试举例2

8、调试举例3

9、编程常见的错误归类

9.1、编译型错误

9.2、链接型错误

9.3、运行时错误


1、什么是Bug?

一般指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞,也叫Bug。

2、什么是调试(Debug)?

当发现程序中存在问题时,下一步就是找到问题并修复问题,这个找问题的过程称为调试,英文叫Debug,是消灭问题的意思。

调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离屏幕代码的方式,找到问题所在的位置,然后确定错误产生的原因,再修复代码,重新测试。

3、Debug和Release

Debug通常称为调试版本:它包含调试信息,并且不做任何优化,便于程序员调试程序;用Debug版本写代码,编译产生的是Debug版本的可执行程序,其中包含调试信息,是可以直接调试的。

Release通常称为发布版本:他往往进行了各种优化,使得程序在代码大小和运行速度上都是最优的。当写完代码使其程序质量符合交付于用户使用的标准,这时就会设置为Release版本,这个是给用户使用的。

Debug由于包含了调试信息,所以内存会更大一些。

4、VS基础调试快捷键

在这里我们将学习程序员是如何调试代码的

4.1、环境准备

首先是环境的准备,需要一个支持调试的开发环境,所以应把编译环境设置为Debug版本。

4.2、调试快捷键

F9:创建断点和取消断点。

F5:启动调试,经常用来跳到下一个断点处,一般是和F9配合使用。

F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。

F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,就会直接完成函数的调用。

CTRL+F5:开始执行不调试,如果想让程序直接运行起来而不调试就可以直接使用。

条件断点:在断点处右击鼠标设置断点的条件。

5、监视和内存观察

5.1、监视窗口

①打开监视窗口(F10开始调试后才能使用监视窗口)

5.2、内存窗口

打开内存窗口

这里列太长了不好观察,可以将列设置为4跟方便观察。

在这里解释一下内存窗口:

与以上相似的窗口还有很多,如:自动窗口(自动帮长序员观察一些值,但是用起来不够方便,所以一般用的比较少)、反汇编(把语句转换成汇编代码)、寄存器(暂存数据)。

6、调试举例1

求:1!+ 2!+ ... +10!

在这里我们先用3试一下值是否正确

这里的结果本应该是9,但是实际编译器出现的是15,实际的结果和预期是不相等的,这就是Bug。

下面我们借助调试解决问题:

经过调试后发现每次进行第二个for循环中ret的值都会保留上一次的值进行运算,所以在进行第二个for循环之前应该加上一个ret = 1;才能解决这个问题。

解决完问题后我们来想一下:

每次

这样会很占用空间,而且过程也很麻烦。

我们下面来进行程序的优化:

7、调试举例2

在VS2022、X86、Debug环境下:

这里我们发现程序进入了死循环在这里我要解释一下:

①i和arr是局部变量,局部变量放在内存的栈区

②战区上的内存的使用习惯是:先使用高地址的空间,在使用低地址的空间

这里我们可以画一幅图更好的展示一下:

i 和 arr 中间空多大空间,完全是取决于编译器的实现,在VS中刚好这里 i 和 arr 中间空了两个整型,所以当 arr[12] 的值会替换 i 的值,从而开始死循环。

不同的编译器中间的空隙不同,如果在VC6.0中这个代码 arr 和 i 之间没有空隙;如果在gcc中这个代码 arr 和 i 之间空一个整型。

8、调试举例3

注意在监视时,观察自定义函数中的值时,想观察一维数组前10个元素应该在监视窗口中输入arr3,10;如果想观察二维数组,则应输入arr4,3。

9、编程常见的错误归类

编程常见错误分为三种:编译型错误、链接型错误、运行时错误。

9.1、编译型错误

编译型错误一般都是语法错误,这类错误一般看错误信息就能找到一些蛛丝马迹的,双击错误信息也能初步跳转到代码错误的地方或者附近。编译错误随着语言的熟练掌握会越来越少,也容易解决。

9.2、链接型错误

编译器报错时会出现“无法解析的外部符号”如下:

这里是由于未包含头文件<stdio.h>

也一样是链接型错误,这里报错是因为函数Add未定义。

9.3、运行时错误

运行时错误需要借助调试,逐步定位问题,调试解决的是运行时问题。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值