引言:
你是否曾为程序运行结果与预期不符而感到抓狂?是否在代码的海洋中迷失,苦苦寻找那个隐藏的错误?别担心,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的时候,就能在编程代码上方看到Debug和Release两个选项,那么它们分别是什么意思呢?
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 调试的作用
- 发现错误:帮助找出程序中的语法错误、逻辑错误和运行时错误,比如计算错误、数据类型不匹配、数组越界等。例如,一个计算平均数的程序,结果总是不对,通过调试能发现计算过程中的错误算式。
- 优化性能:查看程序运行的时间和资源消耗情况,找到性能瓶颈并进行优化,使程序运行更高效。比如,处理大量数据的程序运行缓慢,调试能发现是某个频繁执行的函数耗时过长,从而对其进行优化。
- 理解流程:能够清晰地了解程序的执行流程和各个部分之间的交互关系,加深对程序逻辑的理解。以一个复杂的工作流管理程序为例,通过调试可以明白不同条件下工作流的走向。
- 验证算法:确认所使用的算法在实际程序中的正确性和有效性。像在排序算法的实现中,调试能验证排序结果是否符合预期。
- 定位异常:当程序出现异常或崩溃时,通过调试找到异常发生的位置和原因。例如程序突然死机,调试可以发现是某个特定操作导致了内存泄漏。
- 测试功能:在开发过程中,确保新添加的功能能够正常工作。比如为软件新增了一个文件保存功能,调试能确认文件是否正确保存且内容无误。
- 修复漏洞:发现并修复可能存在的安全漏洞或潜在的风险。例如,一个涉及用户信息处理的程序,调试能发现是否存在数据泄露的风险。
总之,调试是保证程序质量、提高程序性能、加深对程序理解的重要手段。
标签:学会,程序,bug,VS,断点,代码,调试 From: https://blog.csdn.net/2401_85010100/article/details/140660689