bug本意是”虫子“的意识,现在一般是在电脑系统和程序中,隐藏着一些未被发现和隐藏的缺陷和问题,称为程序漏洞。 debug:找到问题的过程。当发现问题时,找到问题,并修复问题,调试一个程序,首先是承认出现了问题,然后通过逐过程的调试,或者隔离和屏蔽代码的方式,找到问题的位置,在修复代码,重新测试。

注:测试测的是Release版本
调试环境的设置为Debug版本

原因举例:当F10调试代码,遇到for循环,Release版本不会进入for循环,Debug版本会进入到里面,一步一步的执行
F9+F5配合使用:断点加调试
补充:F9打印断点,还可以设置条件断点

F5:来到执行逻辑上的下一个断点处 (不是物理上的),想来到物理上的断点,可以把上一个断电取消掉
F5:调试
Ctrl+F5:运行
细致观察:F10:逐过程,处理一次函数调用或一条语句
F11:逐语句,可以进入到函数调用
F10+F11配合使用
前提是:调试起来才能监视和看内存


内存中的数据是倒着存放的

求1!+2!+3!+4!+…10!的和 错误解法
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int ret = 1;
int sum = 0;
for (n = 1; n <= 3; n++)
{
for (i = 1; i <= n; i++)
{
ret *= i;
}
sum += ret;
}
printf("%d", sum);
return 0;
}调试的步骤:弄清这个程序要完成什么功能,出现了什么现象,再去分析 预期的结果是:9,但是实际的结果是:15 经过调试(跟着程序走,看是否是我们的预期效果 ):

当n等于3时,i等于4时,说明ret此时为3的阶乘,但此时ret为12不等于9,说明ret一开始是有值的,原因是ret是全局变量,会有累计的效果
解决办法:
在每次计算前,初始化ret的值

调试环境:X86和Debug版本

题目:运行以下代码,结果是啥?
#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("hehe\n");
}
return 0;
}结果:死循环(编译器忙着死循环,就没报错了)

原因分析(调试):
arr[i]当i为10或11是改的是随机数,当i为12,发现arr[i]也为12,这不是巧合,说明arr[i]和i为同一个空间

验证:

上述创建的都是局部变量(在栈区上) 底层原理:栈区的使用习惯是先高地址再低地址(先创建i,在创建arr数组),而数组在存储的时候,随着下标的增长,地址是由低变高的.

i与arr数组中间差几个地址完全取决于编译器
另外:

验证:当换成X64,i的地址比arr的地址小

当代码量较大时,一步一步调试较麻烦,在有你觉得有问题的地方,打上断点,按F5可以跳到此处,在函数内部打断点,快速跳转到函数

遇到数组传参

当进到函数里面时,里面的内容就看不见了(如下图所示)

解决方法:调试进入函数,如何在监视窗口观察数组的内容:数组名,n的形式

二维数组一样,不同的是只能观察第一行


双击错误会跳到错误的地方

编译时不会报错,生成解决方案时才会报错 双击错误不会跳到错误的地方

