所有发生的事情都一定有迹可循,如果问心无愧也就不需要掩盖,也就没有了迹象,如果问心有愧就必然需要掩盖,那就一定会有迹象,迹象越多越容易顺藤摸瓜,这就是推理的路径。
调试的基本步骤
1.发现程序错误的存在
2.以隔离,消除等方式对错误进行定位
3.确定错误产生的原因
4.提出纠正错误的解决方案
5.对程序的错误给予改正,重新测试
因此我们首先要发现程序的bug,然后将我们的代码,通过注释一步步缩小发生错误的模块,当我们找到bug以后想办法解决与改正就可以了。
在我们编译器中有两个版本debug,release
1.debug我们通常称作调试版本,它包含调试信息,并且不做任何优化,是代码原本的样子,便由于程序员进行调试。
2.release我们通常称为发布版本,它对代码进行了各种优化,使得代码在大小和运行速度方面都是最优的,以便用户更好的使用。
调试的时候我们可以查看程序当前的信息
1.查看零时变量的值
我们可以通过监视窗口来一步步去观察程序变量中值的变化,可以看变量也可以看地址,通过
这些数据与我们预期的数据进行对比,找出问题。
2.查看内存中的存储值
在内存窗口里面我们可以观察内存中每个字节所存储的值,以此对比找出错误。
3.查看汇编代码
我们依然可以通过调试,一步步查看代码在编译器中是如何运行的。变量是什么时候创建的,什么时候开始改变的,如何改变的,存储空间是什么样的,我们都可以观察到。
4.查看调用堆栈
通过调用堆栈,可以清晰的反映函数的调用关系以及所处位置
5.查看寄存器中的信息
可以查看当前运行环境的寄存器的使用信息。
例子
#include<stdio.h>
int main()
{
int i = 0;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=0;i<12;i++)
{
arr[i]=0;
printf("hello\n");
}
return 0;
}
这个代码我们很容易就可以看出数组越界了,但是我们编译起来就会发现程序死循环了,而且并没有报错!!!
这时候我们不妨调试起来
以vs2019为例
而程序之所以没有报错,是因为程序一直忙着执行死循环呢,根本没机会报错!!!
为了减少错误的发生,我们要做一个有心人,累计排错经验!!!