VS-----调试技巧

bug?

bug是什么?

Bug一词的原意是“昆虫”或“虫子”;而在电脑系统或程序中隐藏着的一些未被发现的缺陷或问题,人们也叫它“bug”。

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

Debug

与Bug相对应,人们将发现Bug并加以纠正的过程叫做“Debug”(中文称作“调试”),意即“捉虫子”或“杀虫子”。

Debug:调试版本,包含调试信息;一般在开发完成后发布工程前,调试代码都是在Debug模式下进行;此外,编译器编译时会增加一些调试信息,编译器基本不会对其进行优化。

Release

与Debug不同,Release发布版本,不对源代码进行调试;一般编译器会进行大量的优化,删除无用的代码,指令的次序调整等,让其速度更快;由于Release版本最终是要发送给用户的,发给用户的版本必须要没有问题,测试人员就是最后一个把关的,所以测试人员测试的就是Release版本。

对于同一个代码在不同环境下运行时:

int main()
{
	printf("hahahahaha\n");
	return 0;
}

对比可以看到同一段代码,编译生成可执行文件的大小,在Release模式下占用11KB,而在Debug模式下占用61KB,很明显Release版本较小,Debug版本较大。

VS调试快捷键

那我们如何去调试代码?

调试环境

首先我们需要一个支持调试的开发环境,在VS上设置为Debug模式,如图:

快捷键

常用的几个快捷键:

F9:设置断点和取消断点。通过设置断点,我们可以在调试过程中暂停程序的执行,以便查看变量的值、检查代码的执行流程等。

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

Ctrl + F5:开始执行(不调试)

F10:逐过程调试,通常用来处理一个过程,一个过程可以是一个函数调用,也可以是一个语句,F10在遇到函数时不会进入到函数体中。

F11:逐语句调试,就是每次都执行一条语句,要想进入一个函数的内部进行调试,就要使用F11来进行调试。

除此之外,断点的设置可以加入条件,即条件断点,满足这个条件才能触发,如图:

对于一个代码:

int main()
{
	int i = 0;
	for (i = 0; i <= 12; i++)
	{
		printf("%d ", i);
	}
	return 0;
}

设置完条件后,我们按下F5,此时i来到的6:

监视窗口

我们在调试过程中如何观察代码执行过程中变量的值?这时我们可以打开我们的监视窗口。

如果我们没有调试过程中,此时在窗口中找不到监视窗口;这时我们只需要按一下F10,进行调试,然后再去查看,监视窗口就会出现。

这里有监视1,2,3,4,任何一个窗口都可以使用。

输入想要监视的变量后,按F10或者F11逐步调试即可。

内存窗口

内存窗口和监视的打开方式一样,在调试的状态下可以找到。

调试样例

程序死循环解释

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = {1,2,3,4,5,6,7,8,9,10};
    for(i=0; i<=12; i++)
    {
        arr[i] = 0;
        printf("hello bit\n");
    }
    return 0;
}

上面的代码在VS2022,x86,Debug的环境下会出现两个问题:1、数组访问越界 2、死循环

分析:

我们知道内存分配分为3中:栈区,堆区,静态区;

(1)静态存储区:主要存放static静态变量、全局变量、常量。这些数据内存在编译的时候就已经为他们分配好了内存,生命周期是整个程序从运行到结束。
(2)栈区:存放局部变量。在执行函数的时候(包括main这样的函数),函数内的局部变量的存储单元会在栈上创建,函数执行完自动释放,生命周期是从该函数的开始执行到结束。
(3)堆区:程序员自己申请一块任意大小的内存—也叫动态内存分配。这块内存会一直存在知道程序员释放掉。C语言中,用malloc or new动态地申请内存,用free or delete释放内存。若申请的动态内存不再使用,要及时释放掉,否则会造成内存泄露。

上面代码中i和数组arr[]为局部变量,因此存储在栈区,

for循环中,i的内容是从0,一直增加到12,而数组只有10歌空间,因此会存在数组越界现象,每次访问arr数组i号位置是,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而该位置恰好为i的位置,即arr[12]恰巧将i设置为0,因此造成死循环,我们利用内存窗口来查看会发现,arr[12]的地址与i的地址一样,也就是说他们恰巧共用同一个内存地址。

以上就是VS调试技巧的总结和我的一些理解,希望有所帮助。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值