调试合集(内含VS快捷键)

一、BUG

在当今互联网盛行的时代无论你是否从事IT相关的行业或者学习,都应该听说过bug这个词,甚至在一些特定环境下使用过这个词,bug原本指的是昆虫,特别是臭虫。在计算机领域,bug被用来比喻软件或系统中的错误、缺陷或问题。这些问题可能导致程序运行异常、功能缺失、数据损坏或系统崩溃等现象。Bug的存在是软件开发过程中不可避免的,因为完全没有错误的软件是极其罕见的。程序员和测试工程师通过各种调试和测试手段来发现和解决这些Bug,以提高软件的质量和稳定性,而程序员的工作就是尽可能地去修复这些漏洞,也就是所谓的调试(debug),而这也是我们今天学习的主题

二、调试

什么是调试?

定义
调试是指通过对程序、硬件或系统的错误进行定位、分析和修复的过程,在计算机编程中,调试涉及跟踪程序的运行过程,以发现逻辑错误、语法错误、运行时错误等问题,并采取相应的措施进行纠正。而在我们编写程序的时候大部分时间都是在调试而不是写代码,调试是软件开发过程中不可或缺的重要环节。通过调试,开发人员可以确保软件的正确性和可靠性,提高软件的质量和用户体验。同时,调试也是开发人员提升自身技能和能力的重要途径之一,因此不会调试对于一个程序员来说是很致命的一件事!

调试过程

调试是一个多步骤的过程,主要包括以下几个阶段:

  1. 识别问题:首先,需要确定程序中存在的问题或异常行为。这通常通过运行程序并观察其输出或行为来完成
  2. 隔离问题源:一旦识别出问题,接下来需要定位问题的具体来源。这可能需要分析程序的源代码、执行流程、数据流动等
  3. 纠正问题:在找到问题源后,需要采取适当的措施进行修复。这可能包括修改代码、调整配置、更新依赖等
  4. 测试更正:修复问题后,需要重新运行程序以验证问题是否已被解决。这通常包括单元测试、集成测试等不同类型的测试

调试工具和技术

在调试过程中,开发人员会使用各种调试工具和技术来辅助定位和解决问题。这些工具和技术包括但不限于:

  1. 日志记录:通过在程序中添加日志语句来记录程序的运行状态和关键数据,以便在出现问题时进行回溯和分析
  2. 断点调试:在程序的特定位置设置断点,当程序运行到这些位置时暂停执行,以便开发人员可以检查程序的当前状态和数据
  3. 边界测试:对程序的边界条件进行测试,以发现潜在的错误和异常情况
  4. 代码审查:通过其他开发人员对代码进行审查来发现潜在的错误和改进点

而我们今天所要讨论的就是vs中的断点调试,那么下面就是我们的vs中一些常用的调试快捷键,如果有兴趣可以自行搜索

三、VS常用快捷键

  1. 调试启动与停止
    F5:启动调试,这是最常用的调试快捷键,经常用来跳到下一个断点处,所以通常和切换断点(F9)一起使用
    Ctrl+F5:开始执行(不调试),这个快捷键允许你运行程序,但不会进入调试模式,因此不会暂停在断点处
    Shift+F5:停止调试,这个快捷键用于终止当前正在调试的程序
    Ctrl+Shift+F5:重启调试,这个快捷键可以在开始调试后,快速重新开始调试过程
  2. 断点管理
    F9:切换断点,在代码行上按下此键可以在该行创建或取消断点
    Ctrl+F9:启用/停止断点,这个快捷键用于启用或禁用当前代码中的所有断点,但不会删除它们
    Ctrl+Shift+F9:删除全部断点,这个快捷键会删除当前解决方案中的所有断点
  3. 单步执行
    F10:逐过程,这个快捷键用于执行下一行代码,但不会进入函数或方法内部
    F11:逐语句,这个快捷键用于执行下一行代码,如果下一行代码是函数调用,则会进入该函数内部,所以相比F10,F11会更加详细
    Shift+F11:单步跳出,这个快捷键用于从当前函数或方法中跳出,回到调用该函数或方法的下一行代码
  4. 其他调试快捷键
    Ctrl+Alt+Q:快速观察,这个快捷键允许你在调试过程中快速查看变量或表达式的值,而无需打开“即时”窗口
    F12:转到定义,虽然这个快捷键主要用于查看变量、函数或方法的定义,但在调试过程中也非常有用,因为它可以帮助你快速定位到代码中的特定部分
    Ctrl+G:转到指定行,这个快捷键允许你快速跳转到代码中的任何一行
  5. 注意事项
    快捷键可能会因Visual Studio的版本或用户自定义设置而有所不同,上述快捷键适用于大多数Visual Studio版本,但建议查阅你正在使用的版本的官方文档以获取最准确的信息
    在使用快捷键时,请确保你的光标位于正确的位置,以便执行预期的操作
    在阅读以上内容时建议在VS中写一个简易调用函数进行测试和练习进行熟悉

四、VS中的常用调试功能(附快捷键)

监视窗口

如下图所示可进入监视窗口(Ctrl+D,W
在这里插入图片描述
在这里插入图片描述

监视窗口,特别是在软件开发和调试环境中,如Visual Studio的集成开发环境(IDE)中,扮演着至关重要的角色。其主要作用可以归纳如下:

  1. 实时监控变量和表达式的值
    实时监控:在调试过程中,开发人员可以实时查看变量和表达式的值,这种实时性有助于快速定位和解决代码中的问题,使开发人员能够清楚地了解程序在执行到某个断点时的状态
  2. 支持变量修改和实时测试
    可编辑性:监视窗口不仅用于查看变量的值,还支持对变量进行修改,这种功能允许开发人员在调试过程中进行实时的值调整和测试,从而验证不同的变量值对程序行为的影响
  3. 提供多功能调试信息
    多功能性:除了查看和修改变量的值外,监视窗口还可以计算和显示表达式的结果,为开发人员提供更多的调试信息,这有助于深入理解程序的执行流程和逻辑
  4. 可定制性
    自定义显示内容和布局:开发人员可以根据自己的需求自定义监视窗口的显示内容和布局。这种灵活性使得监视窗口能够更好地适应不同的调试场景和需求,例如上方进入监视窗口的图中可以看见能够打开四个监视窗口,分别在快捷键后再+2,3,4即可
  5. 与其他调试工具协同工作
    便捷性:监视窗口通常是集成开发环境(IDE)的一部分,与断点、单步执行等其他调试工具协同工作,这种集成性使得调试过程更加高效和便捷,例如前文提到的常用快捷键,F5、F9、F10、F11等等,监视窗口都能实时跟进,十分便捷

自动窗口和局部变量

这两个在使用时其实不是那么方便,使用时不可以由使用者添加或者删除监视的变量,其会根据程序所执行到的语句或者程序执行到的局部范围内,自动删减或增加监视的变量,而局部变量的变化范围就是当前程序所执行的所有局部变量都会显示在监视窗口,这些与直接监视不同的是监视可以自己定制需要监视的变量并且不会自动增删变量的监视,而这两个并不用动手输入,在观察一些简单程序时使用自动窗口或局部变量会更加方便

内存窗口

在Visual Studio(VS)中,内存窗口是一个非常重要的调试工具,它对于监控和分析应用程序的内存使用情况具有关键作用。以下是内存窗口的主要用途:

  1. 显示内存使用情况
    内存窗口显示了应用程序在调试期间使用的内存空间,它允许开发者查看内存中的特定内容,包括数据、代码以及未分配内存中的无用随机位,这对于检查内存泄漏、内存损坏等问题非常有帮助

  2. 检查变量和内存地址
    在调试过程中,开发者可以通过内存窗口查看存储在内存中特定位置的变量值。他们可以将内存地址或包含内存地址的指针变量拖动到内存窗口中,以查看该地址处的内存内容。这对于理解程序的内存布局和变量存储方式非常有用

调用堆栈

在Visual Studio(VS)中,调用堆栈对于理解程序的执行流程和定位问题非常有帮助VS中的调用堆栈(Ctrl+D,C)具有以下几个作用:

  1. 显示函数调用序列
    调用堆栈窗口显示了当前执行的函数或过程调用的序列,它按照函数被调用的顺序从顶部到底部排列,顶部是当前执行的函数,底部是程序执行的起点(如main函数或程序的入口点),通过查看调用堆栈,开发人员可以清晰地了解函数是如何被依次调用的,从而理解程序的执行流程

  2. 定位问题代码
    当程序发生错误或异常时,调用堆栈可以帮助开发人员快速定位问题发生的代码位置,由于调用堆栈显示了函数调用的序列,开发人员可以沿着这个序列向上追溯,找到引发错误的函数或代码行,这对于调试复杂的程序尤其有用,因为它可以减少查找问题的时间

  3. 分析递归调用
    对于使用递归算法的程序,调用堆栈可以显示递归调用的深度和顺序,通过观察调用堆栈,开发人员可以轻松地理解递归调用的过程,以及递归何时结束或何时可能导致栈溢出等问题
    下图是调用堆栈的例子
    在这里插入图片描述

五、Debug实例

求n的阶乘之和

即求1!+2!+3!+……+n!
那么我们就有了一个最初的思路:用一个for循环求出单个数的阶乘,再外套一个for循环将这n个阶乘相加即可,代码如下:

int main()
{
	int n,a=1,sum=0;//变量a是每次阶乘的结果,这里赋值为1,方便第一次的乘积
	cout << "求1!+2!+3!+……+n!" << endl << "请输入n的值:";
	cin >> n;//输入所求之数
	for (int j = 0; j < n; j++)//外套循环
	{
		for ( int i = 1; i <= n - j; i++)//求一个数的阶乘,每执行一次就求上一个数的阶乘,直到i=1
		{
			a *= i;
		}
		sum += a;//所有阶乘之和
	}
	
	cout << "求得结果为:"<<sum << endl;//打印阶乘之和
}
输入:3
结果:30

由结果易知此代码出现了bug,因为结果很明显为9,那么我们就使用调试功能进行排查,这里可以直接F11然后使用监视窗口观察关键变量a、i、sum
在这里插入图片描述
这里一直执行到2的阶乘时发现2的阶乘a为12,很明显就是此处有bug,那么观察代码发现在求第二次循环即2的阶乘时a的值没有归1,发现问题之后就要解决问题,我们需要在外套循环内将a复位得到代码:

int main()
{
	int n,a=1,sum=0;//变量a是每次阶乘的结果,这里赋值为1,方便第一次的乘积
	cout << "求1!+2!+3!+……+n!" << endl << "请输入n的值:";
	cin >> n;//输入所求之数
	for (int j = 0; j < n; j++)//外套循环
	{
		a = 1;//新增代码
		for ( int i = 1; i <= n - j; i++)//求一个数的阶乘,每执行一次就求上一个数的阶乘,直到i=1
		{
			a *= i;
		}
		sum += a;//所有阶乘之和
	}
	
	cout << "求得结果为:"<<sum << endl;//打印阶乘之和
}
输入:3
结果:9

根据结果易知bug修改完成

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值