什么是调试?
调试是在当运行代码出现问题时,我们需要找到问题并且解决问题的一种手段,这种手段叫做调试(也是小白变成大佬的一条必经之路)
什么情况下用调试?
代码出问题的情况有许多种,其中逻辑错误是最常见的一种情况,这种情况往往最让人难受,因为写代码的人往往是按照自己理想的过程去解读代码,但事实却是运行结果相差特别大,因此当我们遇见逻辑错误的情况下,我们需要用到调试去了解代码运行的全过程,然后发现并解决问题。
Debug和Release
在VS编写代码时我们能看到Debug和Release这两个选项。
Debug
Debug被称为调试版本,在这种环境下,VS不会对代码进行任何优化,也就是说代码是什么样就是什么样,因此程序猿可以在这个环境下通过调试的手段去发现代码中的根本问题。
Release
Release则被称为发布版本,也就是程序猿写完代码后需要将代码应用到实际当中,在这个环境下,代码不管是运行速度还是所占内存都是最优的,这样就会使用户使用时更加方便。使用Release一般是程序员写完代码,测试再对程序进行测试,直到程序员的质量符合交付给用户使用的标准,这个时候就会设置为release。
VS调试快捷键
下面是我整理的VS调试快捷键(必须是Debug版本才能使用)
F9:创建断点和取消断点
断点:断点可以在程序的任何地方设置,打上断点就可以使得程序执行到想要的位置暂定执行,简单的来说就是断点前的程序会执行,而断点后的程序暂时不执行(除非你用F10和F11)
条件断点:和if语句类似,只有满足条件时才会断点。
F5:启动调试,经常是用来直接跳到下一个断点
举个例子,我们设置了两个断点,当我们开始调试时,如果我们是在第一个断点,那么当我们按下F5,我们就会直接跳到第二个断点,当然了,如果我们在第二个断点开始,再按F5,那么我们又会跳到第一个断点,也就是可以把断点理解成传送门,我们通过F5就可以在这两个断点之间跳跃
F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
F11:逐语句,就是每一次都执行一条语句,但这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须用F11,如果用F10,直接完成函数的调用
CTRL+F5:不调试直接执行代码
监视和内存观察
在调试时我们需要观察代码中变量的变化,和内存的变化,因此我们就需要用到监事和内存观察。
比如
#include<stdio.h> int main() { int arr[10] = { 0 }; int num = 100; char c = 'w'; int i = 0; for (i = 0; i < 10; i++) { arr[i] = i; } return 0; }
监视
开始调试后(否则找不到监视),在菜单栏中【调试】->【窗口】->【监视】,输入要观察的对象就可以了。
内存
如果监视窗口看的不够仔细,也是可以观察变量在内存的存储情况
【调试】->【窗口】->【内存】
调试举例
1:求1!+2!+3!+4!+...10!的和,请看下⾯的代码: #include <stdio.h> //写⼀个代码求n的阶乘 int main() { int n = 0; scanf("%d", &n); int i = 1; int ret = 1; for (i = 1; i <= n; i++) { ret *= i; } printf("%d\n", ret); return 0; } //如果n分别是1,2,3,4,5...10,求出每个数的阶乘,再求和就好了 //在上⾯的代码上改造 int main() { int n = 0; int i = 1; int sum = 0; for (n = 1; n <= 10; n++) { for (i = 1; i <= n; i++) { ret *= i; } sum += ret; } printf("%d\n", sum); return 0; } //运⾏结果应该是错的? 2:在VS2019、X86、Debug 的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥? #include <stdio.h> int main() { int i = 0; int arr[10] = {0}; for(i=0; i<=12; i++) { arr[i] = 0; printf("hehe\n"); } return 0; }