代码实用的调试技巧

一、调试的基本步骤
1.在程序运行时,找出导致程序错误的存在,并进行定位
2.对错误的地方进行标记
3.确定错误产生的原因
4.提出纠正错误的解决办法
5.将改正后的程序,重新运行,重新测试
二、Debug 和 Release
▪Debug
Debug,又称为调试版本,它通常包含调试信息,并且不做任何优化,便于程序员调试程序,但当系统执行时,会生成内存比较大的文件,如下图:

由Debug产生.exe文件足有39KB大小,那为什么会说它生成的文件大呢,接着往下看。

▪Release
Release,又称发布版本,顾名思义,就是一个产品在上市时所进行发布的那个版本,它一般都是经过各种优化,使得程序的大小和运行速度均是最优的,当系统用Release执行时,会生成比较小的文件,如下图:
相同的代码,在Debug上运行是39KB,而在Release上运行是9KB,因此,Release它具有生成文件消耗内存小的优点,但它也有相对不太好的地方。

#include
int main() {
	int i = 0;
	int arr[10] = { 0 };
	for (i = 0;i <= 12;i++) {
		arr[i] = 0;
		printf("good\n");
	}
	return 0;
}

在程序运行前,稍微看看代码就能发现一个错误,那就是数组越界的错误,因为只定义了数组的长度为10,但是在for循环中,却访问到arr[10]、arr[11]、arr[12]的情形,可能会造成程序出现异常,
三、使用Debug找出对应错误
按照我们正常的理解,当上述代码运行到i=10时,arr[i]=0是并不能成功,因为数组的长度只有10,程序应该出现报错之类的信息才对,但是运行程序时,它却一直在进行死循环,无限的循环。因此,我们在代码的第7行设置断点,调用Debug模式下的监视窗口来对代码运行时数值的变化做进一步的分析。
当i=10,11时,arr[i]的数值结果都一样为:

代码实用的调试技巧_第1张图片但当i=12时,arr[i]的值突然变为:

代码实用的调试技巧_第2张图片

当再向下调试时,i的值突然变为1,arr[i]的值为0:

代码实用的调试技巧_第3张图片

继续进行调试,可得知i的值从0到11,arr[i]的值均为0,而当i=12时,arr[i]的值还是12,和上面的情况一样,再向下跑时,结果一直循环,造成了死循环。
接着调用调试模式中的内存窗口,查看调试期间arr数组和i的内存的变化。

代码实用的调试技巧_第4张图片

由监视窗口和内存窗口可看到,arr[12]和i的地址是重合的,并且当i=12时,程序运行到arr[i]=0,即arr[12]=0,因为他们地址相同,因此从此时i的值为也变为0,满足循环条件,所以继续循环,每次到i=12时,他的值会被设置为0,所以就造成了死循环。

这是一道 nice公司的笔试题中的有关的题目,在我们学习代码过程中,20%是语法,80%是调试代码,调试代码在我们未来工作中至关重要,学会调试技巧会使我们在工作中受益匪浅,游刃有余!

你可能感兴趣的:(c语言,visual,studio)