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


相关文章
|
编解码 人工智能 物联网
如何快速搭建一个像“天猫精灵”的智能语音助手?
天猫精灵相信大家都不陌生了,它是阿里巴巴于2017年7月5日发布的AI智能终端品牌。让用户以自然语言对话的交互方式,实现影音娱乐、购物、信息查询、生活服务等功能操作,成为消费者的家庭助手。本文将介绍如何快速搭建一个像“天猫精灵”一样聪明的智能语音助手。
如何快速搭建一个像“天猫精灵”的智能语音助手?
|
机器学习/深度学习 人工智能 机器人
语音克隆达到人类水平,微软全新VALL-E 2模型让DeepFake堪比配音员
【8月更文挑战第10天】微软的VALL-E 2模型标志零样本语音合成新高度,通过重复感知采样与分组编码建模,显著提升语音合成的稳定性与效率。在LibriSpeech等数据集上,VALL-E 2的语音自然度与说话者相似度超越前代和其他系统,达到人类水平。然而,其卓越性能也引发了潜在滥用风险的关注。尽管如此,VALL-E 2在辅助沟通、教育、娱乐等领域的应用前景广阔。[论文](https://arxiv.org/pdf/2406.05370)
328 64
|
11月前
|
SQL 存储 关系型数据库
如何查看数据库中的表及其在SQL中的实现
引言:在数据库管理和数据分析的过程中,我们经常需要查看数据库中的表以获取相关信息。表是数据库中存储数据的主要结构,通过查看这些表,我们可以了解数据库的结构和内容。本文将详细介绍如何使用SQL查询来查看数据库中的表,包括各种相关操作和命令的使用。一、了解数据库和表的基本概念在讨论如何查看数据库中的表之
473 2
|
10月前
|
机器学习/深度学习 数据采集 搜索推荐
大数据与金融风控:信用评估的新标准
【10月更文挑战第31天】在数字经济时代,大数据成为金融风控的重要资源,特别是在信用评估领域。本文探讨了大数据在金融风控中的应用,包括多维度数据收集、智能数据分析、动态信用评估和个性化风控策略,以及其优势与挑战,并展望了未来的发展趋势。
|
机器学习/深度学习 数据采集 算法
Python实现PSO粒子群优化支持向量机回归模型(svr算法)项目实战
Python实现PSO粒子群优化支持向量机回归模型(svr算法)项目实战
|
10月前
|
机器学习/深度学习 人工智能 测试技术
NeurIPS D&B 2024 突破短视频局限!MMBench-Video解读MLLM视频理解能力
GPT-4o 四月发布会掀起了视频理解的热潮,而开源领军者Qwen2也对视频毫不手软,在各个视频评测基准上狠狠秀了一把肌肉。
|
机器学习/深度学习 存储 人工智能
ONNX 与安全:保护模型免受攻击
【8月更文第27天】随着人工智能和机器学习模型的应用越来越广泛,模型的安全性也成为了人们关注的重点。Open Neural Network Exchange (ONNX) 作为一种开放的标准格式,不仅可以促进不同框架之间的模型共享,还面临着如何保护模型不被恶意攻击的风险。本文将探讨 ONNX 在模型安全方面的考虑,以及如何利用 ONNX 和其他技术来保护模型免受攻击。
587 4
|
存储 NoSQL 大数据
基于MongoDB的学生成绩数据操作
基于MongoDB的学生成绩数据操作
711 0
基于MongoDB的学生成绩数据操作
经典递归问题:汉诺塔【超详解】
经典递归问题:汉诺塔【超详解】
1492 0