前言:
我们在写程序的时候可能多多少少都会出现一些bug,使我们的程序不能正常运行,所以为了更快更好的找到并修复bug,使这些问题迎刃而解,学习好如何调试代码是每个学习编程的人所必备的技能。
1. 什么是bug?
我们把导致计算机无法正常工作的东西叫做bug
2. 调试的介绍
(以下的代码都是在vs进行调试的)
2.1 调试是什么?
调试(英语:Debugging/Debut),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
2.2 调试的基本步骤
发现程序错误的存在
以隔离、消除等方式对错误进行定位
确定错误产生的原因
提出纠正错误的解决方法
对程序错误给予改正,重新调试
2.3 Debug和Release的介绍
Debug通常被称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。
Release成为发布版本,它往往是进行了各种优化,是的程序在代码大小和运行速度上都是最优的,以便用户更好的使用。
3.Windows环境调试介绍
3.1 调试环境的准备
在环境中选择Debug选项才能正常调试。(如上图)
3.2 学会快捷键
F5
启动调试,经常用来直接跳到下一个断点处。
F9
创建断点和取消断点
断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或是一条语句。
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。
CTRL + F5
开始执行不调试,如果你想要程序直接运行起来而不调试就可以直接使用。
F10与F10的区别:在调用函数的时候,F11会进入被调用的函数内,而F10不会。
F10 :
F11
3.3 调试如何查看当前的信息
当调试开始的时候可以按照下图的步骤来查看我们想要查看的信息。
3.3.1 查看临时变量的值
要想查看临时变量的值我们可以按照上图的方法开启监视窗口,然后在监视窗口输入我们想要观察的临时变量。
查看形参的值:
仅仅输入形参的名字,只会显示形参的第一个值。(如下图)
而要想查看临时变量的多个值就需要用到“临时变量名+,+想要查看的值的数量”的输入方式进行查看。
例如,查看临时变量的前10个值就可以这样输入:a,10(如下图)
3.3.2 查看内存信息
打开内存窗口后我们可以看到下图的界面。
3.3.3 查看调用堆栈
调佣堆栈反映了函数调用的逻辑
3.3.4 查看反汇编信息
反汇编可以将我们的c语言代码翻译为汇编代码
4.一些调试的实例
4.1 示例一
实现代码:求1!+2!+3!+...+ n!;不考虑溢出。
错误代码:
int main()
{
int n = 0;
scanf("%d", &n);
int ret = 1;
int sum = 0;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d", sum);
return 0;
}
发现错误:
当输入3时正确的结果应改为9但是这里显示的是15。
查找错误原因:
打开监视窗口查看这里临时变量的值
我们可以看到当执行一次for循环这里显示的值是没有任何问题的。
因为ret在这里的预期作用是求i的阶乘,当执行完第三次for循环时,这里i值为3所以ret的预期值为6,但是监视这里显示的值为12,这与所得的结果有所差异,所以这里的错误就应该在ret的上。
解决问题:
对代码分析后发现当执行完一次for循环后ret的值并没有重新赋值为1,而是带着上一次for循环得到的值直接进行了下一次for循环的乘积。所以正确的代码应该为:
int main()
{
int n = 0;
scanf("%d", &n);
//int ret = 1;
int sum = 0;
for (int i = 1; i <= n; i++)
{
int ret = 1;
for (int j = 1; j <= i; j++)
{
ret *= j;
}
sum += ret;
}
printf("%d", sum);
return 0;
}
5. 如何写出好(易于调试)的代码。
5.1 优秀的代码:
1.代码运行正常
2.bug很少
3.效率高
4.可读性高(你看得懂,别人也看得懂)
5.可维护性高
6.注释清晰
7.文档齐全
常见的coding技巧:
1.使用assert
2.尽量使用const
3.养成良好的编码风格
4.添加必要的注释
5.避免编码陷阱(编码陷阱是指在编程中,由于程序员的疏忽或者不熟悉某些编码规范而导致的错误。)