VS调试技巧(全是干货)

简介: VS调试技巧(全是干货)

什么是调试?

调试是在当运行代码出现问题时,我们需要找到问题并且解决问题的一种手段,这种手段叫做调试(也是小白变成大佬的一条必经之路

什么情况下用调试?

代码出问题的情况有许多种,其中逻辑错误是最常见的一种情况,这种情况往往最让人难受,因为写代码的人往往是按照自己理想的过程去解读代码,但事实却是运行结果相差特别大,因此当我们遇见逻辑错误的情况下,我们需要用到调试去了解代码运行的全过程,然后发现并解决问题

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;
}


目录
相关文章
|
3月前
|
Shell API Python
WinDbg调试(三)-- 空格引发的悬案
文章介绍了一个由空格引发的目录删除失败问题。在使用 `rmdir` 指令删除目录时,部分环境出现删除失败但无错误日志的情况。通过 WinDbg 调试发现,路径中的空格导致路径被截断,从而无法正确删除目录。最终解决方案是在路径上添加双引号以确保路径完整。
236 82
|
6月前
|
文字识别 Linux 数据安全/隐私保护
掌握计算机自动化:Pyperclip与CnOCR详细教程(最全使用方法,每行代码都有注释,帮你解决与之有关的所有问题)
掌握计算机自动化:Pyperclip与CnOCR详细教程(最全使用方法,每行代码都有注释,帮你解决与之有关的所有问题)
|
7月前
|
存储 程序员 编译器
C语言第十三弹---VS使用调试技巧
C语言第十三弹---VS使用调试技巧
[疑难杂症系列]程序出错的原因居然因为一个神奇的汉字:㝢
一个导出为EXCEL文件功能之前运行正常,突然出错了。
57 0
|
Arthas 测试技术 开发者
如果你也会这样调试,那真是泰酷辣
学会如何利用 IDEA 高效 debug ,将会大大提升我们的工作效率,希望本文会给你一些参考。
937 36
|
安全 编译器 程序员
一定要掌握的实用调试技巧(vs2019)(上)
一定要掌握的实用调试技巧(vs2019)(上)
|
存储 编译器 C语言
一定要掌握的实用调试技巧(vs2019)(下)
一定要掌握的实用调试技巧(vs2019)(下)
|
Python
7-ELEVEn中的“n”为啥要小写?答案匪夷所思...
7-ELEVEn中的“n”为啥要小写?答案匪夷所思...
104 0