学会VS调试

引言:

你是否曾为程序运行结果与预期不符而感到抓狂?是否在代码的海洋中迷失,苦苦寻找那个隐藏的错误?别担心,VS 调试就是你的救星,让我们一起揭开它神秘的面纱!

1、什么是bug?

在介绍调试前,我们需要了解一个东西,bug。相信大家对这个词应该不陌生吧!

想象一下你正在建造一座房子,你按照自己的设计图努力施工,但是等房子建好了,却发现有些地方不对劲,比如门打不开,或者屋顶漏雨。这时候,你就得去找出问题出在哪儿,然后把它修好,对不对?

在编程里,我们写的代码就像是建造的房子。有时候,当我们运行代码,却发现结果不是我们想要的,这就说明代码里可能有“毛病”,也就是我们说的 bug 。

bug 就是在一个系统、一个东西或者一件事情里,那些影响正常运行或使用的小毛病、小错误。

bug本意是“昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或 问题,简称程序漏洞。

那你知道bug这个词是怎么来的吗?为什么我们现在管故障叫bug呢?

科普:

“Bug”的创始⼈格蕾丝·赫柏(GraceMurrayHopper),她是⼀位为美国海军工作的电脑专家, 1947年9月9日,格蕾丝·赫柏对HarvardMarkII设置好17000个继电器进行编程后,技术⼈员正在进行 整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部⼀组继电器的 触点之间有⼀只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以 在报告中,赫柏⽤胶条贴上⻜蛾,并把“bug”来表示“⼀个在电脑程序⾥的错误”,“Bug”这个说法⼀直沿用到今天。

2、什么是调试?

当我们发现程序中存在问题,我们想要解决问题,那就必须要找到问题在哪,是吧!

找问题的这个过程叫做调试,英文名称Debug,意味消灭bug。

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

VS 调试就像是给你一个超级放大镜和一个神奇的遥控器。放大镜能让你清楚地看到代码运行时每一个小细节,比如每个变量的值是多少,函数是怎么一步步执行的。

而那个神奇的遥控器呢,可以让你控制代码的运行速度。你可以让代码一行一行慢慢地走,这样就能仔细观察每一步是不是正确的。

比如说,你写了一个计算工资的程序,但是算出来的结果总是不对。通过 VS 调试,你能看到每一个员工的工资数据在计算过程中的变化,就能很快发现是不是哪个计算步骤出错啦。

总的来说,VS 调试就是帮助我们在代码的世界里,像侦探一样找出问题,然后解决问题,让我们的程序能够正常、完美地运行!

3、Debug和Release

当我们打开VS的时候,就能在编程代码上方看到DebugRelease两个选项,那么它们分别是什么意思呢?

Debug通常被称为调试版本,它包含调试信息,并且不做任何优化,便于我们调试程序;

我们在写代码的时候,需要经常性的调试代码,因此这里默认设置为Debug,,这样编译产生的是 debug 版本的可执行程序,其中包含调试信息,是可以直接调试的。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的, 以便用户很好地使⽤。当程序员写完代码,测试再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为 release ,编译产⽣的就是 release 版本的可执行程序,这个 版本是用户使用的,⽆需包含调试信息等。

对比可以看到从同⼀段代码,编译⽣成的可执行⽂件的大小,release版本明显要小,而debug版本明显⼤。

4. VS调试

当我们了解了工具后,也要学会怎么使用它。

4.1 环境准备

我们需要一个支持调试的环境,也就是Debug环境,在我们自己平时写代码的时候,就可以调到Debug,如图

4.2 快捷键使用

调试最常使用的几个快捷键

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

断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执 行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节。

比如说,你写了一个游戏程序,玩家得分计算好像不对,在相关代码处设置断点,就能在程序停下时查看得分的计算过程和相关数据。

如上图,当出现红色圆点,说明断点已经创建完成了。

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

注意:如果有两个断点,会执行逻辑上的第一个断点,而不是按顺序执行。

上图中有两个断点,但是由于第一个是循环,因此当你使用F5的时候,会再次跳到第一个断点,而不会跳到第二个断点。(这个例子不是很好) 

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

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

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

5 监视与内存观察

在调试的过程中我们,如果要观察代码执行过程中,上下文环境中的变量的值,有哪些方法呢? 这些观察的前提条件⼀定是开始调试后观察,比如:

#include<stdio.h>
int main()
{
	int sum = 0;
	int i = 0;
	int arr[10] = { 0 };
	for(i = 0; i <= 9; i++)
	{
		scanf("%d", &arr[i]);
		sum += arr[i];
	}
	double average = (double)sum / 10;
	printf("平均值是 %f \n", average);

	return 0;
}

5.1 监视

开始调试后,在菜单栏中【调试】->【窗口】->【监视】,打开任意⼀个监视窗⼝,输⼊想要观察的对 象就行。 按下F10打开监视窗口:

在监视窗口中观察:

5.2 内存

如果监视窗⼝看的不够仔细,也是可以观察变量在内存中的存储情况,还是在【调试】->【窗口】-> 【内存】 打开内存窗口

内存窗口的解读

在打开内存窗⼝后,要在地址栏输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据

除此之外,在调试的窗⼝中还有:⾃动窗⼝,局部变量,反汇编、寄存器等窗⼝。

6 调试的作用

  1. 发现错误:帮助找出程序中的语法错误、逻辑错误和运行时错误,比如计算错误、数据类型不匹配、数组越界等。例如,一个计算平均数的程序,结果总是不对,通过调试能发现计算过程中的错误算式。
  2. 优化性能:查看程序运行的时间和资源消耗情况,找到性能瓶颈并进行优化,使程序运行更高效。比如,处理大量数据的程序运行缓慢,调试能发现是某个频繁执行的函数耗时过长,从而对其进行优化。
  3. 理解流程:能够清晰地了解程序的执行流程和各个部分之间的交互关系,加深对程序逻辑的理解。以一个复杂的工作流管理程序为例,通过调试可以明白不同条件下工作流的走向。
  4. 验证算法:确认所使用的算法在实际程序中的正确性和有效性。像在排序算法的实现中,调试能验证排序结果是否符合预期。
  5. 定位异常:当程序出现异常或崩溃时,通过调试找到异常发生的位置和原因。例如程序突然死机,调试可以发现是某个特定操作导致了内存泄漏。
  6. 测试功能:在开发过程中,确保新添加的功能能够正常工作。比如为软件新增了一个文件保存功能,调试能确认文件是否正确保存且内容无误。
  7. 修复漏洞:发现并修复可能存在的安全漏洞或潜在的风险。例如,一个涉及用户信息处理的程序,调试能发现是否存在数据泄露的风险。

   总之,调试是保证程序质量、提高程序性能、加深对程序理解的重要手段。

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值