调试的重要性
在我们写代码的时候,如果程序出现了bug,那么下一步就是找到bug并修复bug!而这个找问题的过程就被称为调试(英文叫debug,消灭bug的意思)。
调试能观察到程序内部执行的细节,可以增加程序员对代码的理解和掌控,也能更高效的解决程序中存在的bug,提高写代码的能力!
调试的环境
在VS上编写程序的时候有两个版本,一个是Release、另一个是Debug
Debug称为调试版本,这个版本包含调试信息,并且不做任何优化,是程序员在调试程序时候用到的版本!
Release称为发布版本,这个版本是用户直接使用的,往往进行了各种优化,使得程序在代码大小和运行速度上都是最优的,而且不包含调试信息(不能调试)!
调试常用到的快捷键
F9:创建断点和取消断点
也可以在上图所指的地方单击鼠标左键创建和取消!
断点的作用:
断点可以在程序的任意位置进行设置,打上断点就可以使得程序执行到断点处暂停执行,可用于与其他的一些快捷键配合使用,便于观察。
条件断点:只有在程序执行过程中满足这个条件才触发断点,在断点处单击鼠标右键,然后点条件就可以设置想要的条件进行观察了!
F5:启动调试,经常用来直接跳到下一个断点处,一般是和F9配合使用
这里说的下一个断点不是指物理意义上的下一个断点,而指的是程序执行逻辑上的下一个断点!
F10:逐过程调试,可以是一条语句,也可以是一次函数调用
按F10调试时不能进入函数的内部观察细节!
F11:逐语句调试
按F11可以使我们在调试时让程序的执行逻辑进入函数内部,便于更好的观察细节!
Ctrl+F5:开始执行不调试
可以让程序直接运行起来
监视
当开始调试之后,在菜单栏中选择【调试】->【窗口】->【监视】,然后任意打开一个就可以观察程序运行时候的一些变量或者表达式了!
例如要观察下面这个代码中变量的值
内存
内存可以观察变量在内存中的存储情况。也是在开始调试之后,在菜单栏中选择【调试】->【窗口】->【内存】,然后任意打开一个
在内存中观察数据要在地址栏处输入地址才能在该地址处观察数据
举例
假如要调试下面这个代码
#include <stdio.h>
int add(int x, int y)
{
int r = 0;
r = x + y;
return r;
}
int main()
{
int a = 10;
int b = 70;
//写一个函数计算两个整数的和
int ret = add(a, b);
return 0;
}
调用add函数之前:先按F10开始调试
调用add函数:在代码执行到16行时,按F11进入函数内部,按F10执行下一条语句
调用完add函数之后变量ret的值:
常见的错误归类
编译型错误:一般是语法错误
链接型错误:比如拼写错误、头文件没包含等等
运行时错误:需要借助调试才能逐步定位问题所在,进而解决问题