VS实⽤调试技巧解析

      本章介绍的是有关VS中调试的内容,同时我们会了解到bug,调试以及debug和release等相关的知识,同时,本章也会带着大家去调试几个代码,让大家更好的理解调试的作用和方法。

1.bug和调试

    相信大家对于这个词一定不陌生,平时带游戏时我们也会常常用到这个词。

     bug本意是“昆⾍”或“⾍⼦”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或问题,简称程序漏洞
    那么调试就是来寻找并消灭bug的, 调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调 试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码, 重新测试。

2.Debug和Release

    不知道大家在使用VS时有没有注意到,在VS顶部有Debug和Release这个选项

它们代表什么意思呢?

        Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序
程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为 debug ,这样编译产⽣的是
debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。
        Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码⼤⼩和运⾏速度上都是最优的,以便⽤⼾很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾使⽤的标准,这个时候就会设置为 release ,编译产⽣的就是 release 版本的可执⾏程序,这个版本是⽤⼾使⽤的,⽆需包含调试信息等。
同时Debug代码编译成的文件要比Release代码编译成的文件内存大。

3,VS调试快捷键

      在调试之前,我们要将VS设置为Debug,这样我们才能开始调试,同时我们还要记住几个快捷键,方便我们调试。

F9:创建断点和取消断点
断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执
⾏,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。
条件断点:满⾜这个条件,才触发断点
F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是和F9配合使⽤。
F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。
F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。
F10与F11的区别就在于,一个直接调用函数,不进入函数内部,一个可以直接进入函数内部调试观察。 
想要了解更多快捷键,有兴趣可以去看看: http://blog.csdn.net/mrlisky/article/details/72622009

4.调试过程

     接下来我们开始调试,看以下代码

int Max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else
	{
		return b;
	}
}
int main()
{
	int a, b;
	scanf("%d %d", &a, &b);
	int max=Max(a,b);//选出二者之间的较大值
	printf("%d", max);
	return 0;
}

如果我们要从最开始往下调试,首先我们先按下F11或者F10

我们发现有一个箭头的东西,这个箭头代表我们调试到了哪一步,之后我们继续按F10或者F11

我们发现当箭头走到scanf时消失了,这时候提示我们输入数据,此时,就可以输入我们想要测试的数据用例了。

当我们输入完数据并按下回车就可以继续调试了。

这时候我们发现有一个判断大小的函数,此时我们就不能和上述一样,无脑按F10与F11了,当我们不想进入函数,直接调用,我们就可以直接按下F10

可是,当我们想要进入函数观察,就可以按下F11.

这时候有人会问,那我每次调试都要从头开始,我想从这个64行代码开始,有没有什么办法,

此时F9和F5的作用就来了。

当我们想要从哪一行代码开始时,我们可以选定这一行代码按下F9,就出现了断点了,此时我们按下F5就可以从这段代码开始,之后按下F10或F11调试就可以了。

断点的设置我们也可以用鼠标来进行,只需要点击代码左侧就可以了。

断点可以设置多个

只需再次按下F5就可以跳转道下一个断点,有人会问,为什么不从51行开始,而是从64开始呢?

这是因为所有调试首先都是从main函数开始的,之后main函数中有调用自定义函数时,F5才能跳转到有断点函数中,即使自定义了一个函数,main函数中没有调用,即使在自定义函数设置了断点,也不会跳转过去。

5.监视和内存观察

      在调试的过程中我们,如果要观察代码执⾏过程中,上下⽂环境中的变量的值,有哪些⽅法呢?

我们先来看看这段代码

#include <stdio.h>
int main()
{
 int arr[10] = { 0 };
 int num = 100;
 char c = 'w';
 int i = 0;
 for (i = 0; i < 10; i++)
 {
 arr[i] = i;
 }
 return 0;
}

1.监视

当我们想要看看arr里面存储的是什么,我们怎么看呢?

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

为什么arr里面不是0而是随机数呢?因为此时我们程序还没有走完这一步,当我们继续按下F10或F11就可以了。

同样我们也可以看看num,c中存储的数据

2.内存

内存的查看步骤和监视一样

【调试】->【窗⼝】->【内存】
这个数据展示我们可以调节为4行
在打开内存窗⼝后,要在地址栏输⼊:arr,&num,&c,这类地址,就能观察到该地址处的数据。

6.调试举例

1!+2!+3!+4!+...10! 的和
int main()
{
	int n = 0;
	int i = 1;
	int sum = 0;
	int ret = 1;
	for (n = 1; n <= 10; n++)
	{
		for (i = 1; i <= n; i++)
		{
			ret *= i;
		}
		sum += ret;
	}
	printf("%d\n", sum);
	return 0;
}

我们运行一下

我们发现与正确结果不一样,什么问题,我们调试看看
当我们发现n=3时,i此时只为1,这时ret应该也为1为什么是2呢?
仔细想想我们发现,当我们每次算完一个阶乘后,发现ret的值保留下来,导致程序错误,这是时候我们只需要在阶乘之前重置一下ret的数

7.编程常⻅错误归类

1.编译型错误

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

2.链接型错误

看错误提⽰信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。⼀般是因为
标识符名不存在
拼写错误
头⽂件没包含
引⽤的库不存在

3.运⾏时错误

运⾏时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运⾏时问题。

8.结语

本章我们认识了调试的过程与应用,一个好的程序,离不开调试,在之后的学习中我们也会经常去调试,这样才能发现我们的问题所在并去改正,加油吧!!!

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值