目录
一、什么是调试
1.介绍调试
2.Debug与Release
3.Debug与Release的对比
二、怎么调试
1.介绍几个调试快捷键
2.调试的时候查看程序当前信息
三、常见编程错误
1.编译型错误(最简单)
2.链接型错误
3.运行时错误(最难)
下面的内容均在VS2022上进行
(1)调试可以干什么
调试(Debugging / Debug),又称排错。我们的代码出现错误或者bug,就可以用调试的方法去查找
(2)调试的大致步骤
(1)Debug
(2)Release
#include
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
必须在Debug的版本下才能调试
(1)F5
【作用】:启动调试,经常用来直接跳到下一个断点处。常配合F9使用
(2)F9
【作用】:创建断点和取消断点
断点:鼠标对着某一行按下F9,就可以创建作业的一个断点,再按一下就可以取消(或者对着灰色区域使用鼠标左键也可以)
(3)F10
【作用】:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
【使用】当代码可以通过编译之后,点击F10,代码就会进入调试面板,也可以用来控制语句一条一条的执行。我们可以看一下当按下F10调式起来之后的页面
(4)F11
【作用】:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最长用的)。
【使用】当代码调试起来之后,使用F11可以控制代码一条一条的往下走;也可以使其进入函数内部。
(5)ctrl+F5
【作用】:开始执行不调试,就是让你的代码运行起来,下面整个页面就是ctrl+F5代码运行起来的结果。
(1)查看临时变量的值(用的最多)
我们使用下面的代码演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include
int add(int x,int y) {
return x + y;
}
int main() {
int a = 10;
int b = 20;
int c = add(a,b);
printf("%d\n",c);
return 0;
}
先看下面一段代码:需要将数组的地址作为参数传入函数内部。下面对其调试
#include
void test(int arr[],int len) {
int i = 0;
for (i = 0; i < len;i++) {
printf("%d ",arr[i]);
}
}
int main() {
int arr[] = {1,2,3,4,5,6,7,8,9,10};
int len = sizeof(arr) / sizeof(arr[0]);
test(arr,len);
return 0;
}
(2)查看内存信息
我们使用下面的代码演示:
#include
int main() {
int a = 10;
int* p = NULL;
p = &a;
printf("%d\n",*p);
return 0;
}
(3)查看调用堆栈(用的较少)
(4)查看汇编信息(当查看函数栈帧空间的建立时有大用)
【第一种方式】调试开始之后,点击鼠标右键,选择选项
【第二种方式】
(5)查看寄存器信息(用的较少)
我们知道,源码变成程序需要经历:编译(预处理、编译、汇编)、链接、运行,在每一个阶段发生的错误就对应每一种错误。
想要减少bug就要细心,想要及时找出bug,就要多调试,多练