首页 > 其他分享 >学会VS调试

学会VS调试

时间:2024-07-28 17:55:15浏览次数:17  
标签:学会 程序 bug 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. 修复漏洞:发现并修复可能存在的安全漏洞或潜在的风险。例如,一个涉及用户信息处理的程序,调试能发现是否存在数据泄露的风险。

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

标签:学会,程序,bug,VS,断点,代码,调试
From: https://blog.csdn.net/2401_85010100/article/details/140660689

相关文章

  • 如何在 Django 中调试失败的测试?
    如何调试我的测试?例如,我通过POST创建一个条目并期望它验证并返回特定页面。它可以在浏览器和shell中工作,但测试是唯一失败的事情(讽刺的是!)。我想打印对控制台的响应或其他东西,这样我就可以读取错误或你有什么。但我只能看到我print中的东西,例如视图。不确定是否......
  • 7月28日 竞彩足球!哈马比vs米亚尔比 维京vs莫尔德
    昨日复盘今日扫盘哈马比队,作为瑞典超级联赛的传统强队,凭借其在斯德哥尔摩索德尔体育场的主场优势,一直展现出强大的竞争力。本赛季,球队以稳定的表现,近6场联赛中取得了4胜1平1负的佳绩,防守端表现尤为出色,主场进攻力同样强劲。不过,在与米亚尔比队的交锋中,哈马比队本赛季首次对......
  • 【C++软件调试技术】使用 Windbg 分析软件异常时的诸多细节与技巧总结
    目录1、dump文件1.1、dump文件的生成方式1.2、dump文件的大小2、pdb符号文件2.1、pdb文件的路径设置2.2、pdb文件的时间戳与名称问题2.3、如何确定要找哪些pdb文件?3、使用Windbg静态分析dump文件以及动态调试程序的一般步骤4、确定发生异常或崩溃的业务模块,到业务模块......
  • 【高中数学/指数、对数】比大小:log_9_10 VS log_10_11
    【问题】比大小:log_9_10VSlog_10_11【解答】下面将采用列表法分步解答原式log_9_10log_10_11变换(关键步骤)log_9_9*10/9log_10_10*11/10分离log_9_9+log_9_10/9log_10_10+log_10_11/10简化1+log_9_10/91+log_10_11/10指代设a=log_9_10/9设b=log_10_11/10指数化9^a=10/910^......
  • vscode-react-javascript-snippets
    SnippetsSnippetsinfoEveryspaceinside {} and () meansthatthisispushedintonextline:) $ representeachstepafter tab.TypeScript hasowncomponentsandownsnippets.Usesearchorjusttype ts beforeeverycomponentsnippet.I.E. t......
  • typescript: vscode create project
       npmcreatevue@latestcdvue-projectnpmi-Dtypescriptnpminstall-gtypescriptts-nodenpminstallwebpack-gnpminstall-g@vue/clinpminstall-gtypescripttsc--versionnpminstall--gcreate-vueornpminstall--g@vue/clinp......
  • GraphHopper路劲规划导航(Android源码调试运行)
    本文主要记录在运行graphhopper安卓版路径规划导航源码的步骤和遇到的问题。成功运行了程序,但是路劲规划一直不成功,问题一开始是服务地址,后来又是key的问题,在这个项目中涉及到了graphhopper、mapbox、mapilion的key,mapbox带导航的key我一直无法获取。目前最大的问题:我无法......
  • 因子分析vs主成分分析
    前两篇文章介绍了因子分析与主成分分析的原理与基本步骤。初次学习时,大家可能感觉这是两个基本相同的方法,但实际上两者间还是有一定差异的。这篇文章就带大家盘点一下两个方法间的异同。目的因子分析:旨在识别观测变量背后的潜在因素或结构,这些因素是不可观测的。它通常用......
  • 文心一言 VS 讯飞星火 VS chatgpt (311)-- 算法导论22.2 9题
    九、设G=(V,E)......
  • vsftpd搭建FTP服务器 - 虚拟用户
    命令记录$sudoaptinstallvsftpddb-util$sudonano/etc/vsftpd.conf$sudonano/etc/vsftpd/vsftpd-virtual-users.txt$sudodb_load-T-thash-f/etc/vsftpd/vsftpd-virtual-users.txt/etc/vsftpd/vsftpd-virtual-users.dbls/etc/vsftpd/vsftpd-virtual-use......