【c语言日寄】Vs调试——新手向

在这里插入图片描述

【作者主页】siy2333
【专栏介绍】⌈c语言日寄⌋:这是一个专注于C语言刷题的专栏,精选题目,搭配详细题解、拓展算法。从基础语法到复杂算法,题目涉及的知识点全面覆盖,助力你系统提升。无论你是初学者,还是进阶开发者,这里都能满足你的需求!
【食用方法】1.根据题目自行尝试 2.查看基础思路完善题解 3.学习拓展算法
【Gitee链接】资源保存在我的Gitee仓库:https://gitee.com/siy2333/study


文章目录

  • 前言
  • 一、简单C问题的代码引入
  • 二、什么是调试
    • 调试的主要步骤包括:
  • 三、Debug和Release版本的介绍与区别
    • Debug版本
    • Release版本
    • Debug和Release版本的区别
  • 四、调试的准备
  • 五、调试快捷键的介绍
  • 六、调试窗口的使用
  • 七、定位问题代码
  • 八、总结


前言

在软件开发过程中,编写代码只是第一步,更重要的是确保代码能够正确运行并满足需求。而调试(Debugging)是实现这一目标的关键环节。本文将通过一个简单的C语言问题引入,详细介绍VS2022的基本调试功能,包括Debug和Release版本的区别、调试的准备、调试快捷键、调试窗口的使用以及如何通过调试定位问题代码。无论你是初学者还是有一定开发经验的开发者,阅读本文都会带来收获~


一、简单C问题的代码引入

我们先来看一个简单的C语言程序。这个程序的目标是计算两个整数的和,并输出结果。然而,程序中存在一些问题,接下来,我们将通过调试来发现代码的错误。

#include <stdio.h>int add(int a, int b) {return a - b;  // 这里故意写错了,应该是 a + b
}int main() {int num1 = 10;int num2 = 20;int result = add(num1, num2);printf("The result is: %d\n", result);return 0;
}

在这个程序中,add函数的实现是错误的,它返回的是两个数的差而不是和。

二、什么是调试

调试是指在软件开发过程中,通过一系列工具和技术手段,查找并修复代码中的错误(Bug)的过程。调试的目的是确保程序能够按照预期运行,输出正确的结果。调试不仅可以帮助我们发现程序中的逻辑错误,还可以帮助我们理解程序的执行流程,优化代码性能。

调试的主要步骤包括:

  1. 启动调试:通过IDE或调试工具启动程序的调试过程。
  2. 设置断点:在代码中设置断点,使程序在特定位置暂停执行。
  3. 单步执行:逐行或逐语句执行代码,观察程序的执行过程。
  4. 查看变量值:在调试过程中查看变量的值,分析程序状态。
  5. 分析调用堆栈:查看函数调用的顺序,定位问题的源头。
  6. 修复问题:根据调试结果,修改代码中的错误。
  7. 重复测试:修复问题后重新运行程序,确保问题得到解决。

调试是软件开发中不可或缺的一部分,它能够帮助我们快速定位问题,提高开发效率,确保软件质量。

三、Debug和Release版本的介绍与区别

在Visual Studio中,程序可以以两种模式编译:Debug模式和Release模式。这两种模式在编译和运行时的行为有显著差异。在这里插入图片描述

Debug版本

Debug版本是用于调试的程序版本,它包含了许多调试信息,方便开发者在调试过程中查看程序的执行状态。Debug版本的主要特点包括:

  • 调试信息:包含完整的调试信息,如变量名、函数名、源代码行号等,方便调试工具在运行时与源代码进行映射。
  • 未优化代码:代码未经过优化,保持与源代码一致的执行顺序,方便单步执行和查看变量值.
  • 断言支持:支持断言(Assert)功能,可以在运行时检查程序的逻辑错误。 内存管理:在Debug模式下,VisualStudio会为程序分配额外的内存保护,帮助检测内存泄漏和越界访问等问题。

Release版本

Release版本是用于发布的程序版本,它经过了优化,以提高程序的运行效率和性能。Release版本的主要特点包括:

  • 优化代码:对代码进行了优化,包括指令优化、循环展开、内联函数等,以提高程序的运行速度。
  • 无调试信息:不包含调试信息,减小程序的体积,提高运行效率。 断言禁用:默认情况下禁用了断言功能,以避免对性能的影响。
  • 内存管理:不包含额外的内存保护,因此在Release模式下可能无法检测到某些内存问题。

Debug和Release版本的区别

特性Debug版本Release版本
调试信息包含完整调试信息不包含调试信息
代码优化未优化,保持与源代码一致优化,提高运行效率
断言支持支持断言默认禁用断言
内存管理包含额外的内存保护不包含额外的内存保护
程序体积较大较小
运行速度较慢较快

内存对比
在这里插入图片描述
在开发过程中,我们通常使用Debug版本进行调试,修复问题后,再切换到Release版本进行发布。了解Debug和Release版本的区别,可以帮助我们更好地选择合适的模式进行开发和调试。

四、调试的准备

在使用VS2022进行调试之前,我们需要进行一些准备工作,以确保调试环境的正确配置。

  1. 创建项目
    首先,我们需要创建一个新的项目。在VS2022中,选择“创建新项目”,选择C语言项目模板(如“控制台应用程序”),并填写项目名称和路径。
  2. 编写代码
    在项目中编写需要调试的代码。例如,我们可以将前面提到的简单C程序复制到项目中。
  3. 配置调试模式
    确保项目配置为Debug模式。在VS2022中,可以通过工具栏上的配置管理器选择Debug模式。
  4. 设置断点
    在代码中设置断点,使程序在特定位置暂停执行。设置断点的方法是:将光标移动到需要暂停的代码行,然后按F9键或右键选择“切换断点”。断点设置成功后,该行代码会显示一个红点。
    在我们的示例程序中,我们可以在add函数和printf语句处设置断点。

五、调试快捷键的介绍

VS2022提供了丰富的调试快捷键,帮助开发者快速进行调试操作。掌握这些快捷键可以大大提高调试效率。以下是一些常用的调试快捷键:

  1. 启动调试
    F5:开始调试并运行程序。如果程序中设置了断点,程序会在第一个断点处暂停。
    Ctrl + F5:运行程序而不启动调试。这通常用于测试Release版本。
  2. 暂停和停止调试
    Shift + F5:停止调试,退出调试模式。
    Ctrl + Break:暂停正在运行的程序。
  3. 单步执行
    F10:逐过程执行代码(Step Over)。执行当前语句,但不进入函数内部。
    F11:逐语句执行代码(Step Into)。执行当前语句,如果当前语句是函数调用,则进入函数内部。
    Shift + F11:跳出当前函数(Step Out)。从当前函数返回到调用它的函数。
  4. 查看变量值
    Ctrl + Alt + V, A:打开“局部变量”窗口,查看当前作用域内的变量值。
    Ctrl + Alt + V, F:打开“监视”窗口,添加并查看特定变量的值。
  5. 调用堆栈
    Ctrl + Alt + C:打开“调用堆栈”窗口,查看函数调用的顺序。
  6. 其他快捷键
    Ctrl + Shift + F9:清除所有断点。
    Ctrl + F9:设置或清除断点。
    掌握这些调试快捷键,可以帮助我们更高效地进行调试操作,快速定位和解决问题。

六、调试窗口的使用

VS2022提供了多种调试窗口,帮助开发者在调试过程中查看程序的执行状态和相关数据。以下是一些常用的调试窗口及其使用方法:

  1. 监视窗口
    监视窗口用于查看和修改变量的值。在调试过程中,可以通过以下步骤使用监视窗口:
  • 打开监视窗口:在调试过程中,通过菜单栏选择“调试”->“窗口”->“监视”->“监视1”。
  • 添加变量:在监视窗口中输入变量名,按回车键,即可查看该变量的值。
  • 修改变量值:在监视窗口中直接修改变量的值,可以观察程序的行为变化。

在我们的示例程序中,我们可以在监视窗口中添加num1、num2和result变量,观察它们的值在程序运行过程中的变化。

在这里插入图片描述

  1. 内存窗口
    内存窗口用于查看和修改内存中的数据。在调试过程中,可以通过以下步骤使用内存窗口:
  • 打开内存窗口:在调试过程中,通过菜单栏选择“调试”->“窗口”->“内存”->“内存1”。
  • 查看内存数据:在内存窗口中输入内存地址或变量名,可以查看该地址或变量对应的内存数据。
  • 修改内存数据:在内存窗口中直接修改内存数据,可以观察程序的行为变化。

在我们的示例程序中,我们可以在内存窗口中查看result变量对应的内存数据,确认其值是否正确。

在这里插入图片描述

  1. 调用堆栈窗口
    调用堆栈窗口用于查看函数的调用顺序。在调试过程中,可以通过以下步骤使用调用堆栈窗口:
  • 打开调用堆栈窗口:在调试过程中,通过菜单栏选择“调试”->“窗口”->“调用堆栈”。
  • 查看调用顺序:在调用堆栈窗口中,可以看到当前函数的调用链,包括调用函数和被调用函数的名称、文件名和行号。
  • 跳转到调用位置:在调用堆栈窗口中双击某个调用位置,可以跳转到对应的代码位置,方便分析问题。

在我们的示例程序中,我们可以在调用堆栈窗口中看到main函数调用了add函数,确认问题是否出在add函数中。

七、定位问题代码

通过前面的调试准备和调试工具的使用,我们已经具备了定位问题代码的能力。以下是一个完整的调试过程,展示如何通过调试定位并解决问题代码。

  1. 启动调试
    在VS2022中,按F5键启动调试。程序会在第一个断点处暂停执行。
  2. 观察变量值
    在监视窗口中添加num1、num2和result变量,观察它们的值。在add函数中,num1和num2的值分别为10和20,但result的值为-10,显然不符合预期。
  3. 单步执行
    在add函数中按F11键逐语句执行代码,观察变量值的变化。发现return a - b;语句返回的是两个数的差,而不是和。
  4. 修改问题代码
    将return a - b;语句修改为return a + b;,保存修改。
  5. 重新调试
    重新启动调试,按F5键运行程序。观察输出结果,确认问题是否解决。如果输出结果为The result is: 30,则问题已经解决。
    通过以上步骤,我们成功定位并解决了程序中的问题。调试工具帮助我们快速分析程序的执行过程,找到问题的根源,并修复问题。

八、总结

调试是软件开发中不可或缺的一部分,它能够帮助我们快速定位和修复代码中的问题,提高开发效率,确保软件质量。在本文中,我们通过一个简单的C语言程序,详细介绍了VS2022的基本调试功能。我们学习了如何准备调试环境、使用调试快捷键、查看变量值、分析调用堆栈以及定位问题代码。希望本文能够帮助你更好地掌握VS2022的调试功能,提升你的开发能力。

关注窝,每三天至少更新一篇优质c语言题目详解~

[专栏链接QwQ] :⌈c语言日寄⌋CSDN
[关注博主ava]:siy2333
感谢观看~ 我们下次再见!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68975.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双指针+前缀和习题(一步步讲解)

前言&#xff1a;如果解决下面这几道题有些问题&#xff0c;或者即使看了我画的过程图也不理解的可以去看看我的上一篇文章&#xff0c;有可能会对你有帮助。 一、《数值元素的目标和》---来自AcWing 数组元素的目标和 给定两个升序排序的有序数组 A和 B&#xff0c;以及一个…

单调栈详解

文章目录 单调栈详解一、引言二、单调栈的基本原理1、单调栈的定义2、单调栈的维护 三、单调栈的应用场景四、使用示例1、求解下一个更大元素2、计算柱状图中的最大矩形面积 五、总结 单调栈详解 一、引言 单调栈是一种特殊的栈结构&#xff0c;它在栈的基础上增加了单调性约束…

分布式光纤应变监测是一种高精度、分布式的监测技术

一、土木工程领域 桥梁结构健康监测 主跨应变监测&#xff1a;在大跨度桥梁的主跨部分&#xff0c;如悬索桥的主缆、斜拉桥的斜拉索和主梁&#xff0c;分布式光纤应变传感器可以沿着这些关键结构部件进行铺设。通过实时监测应变情况&#xff0c;能够精确捕捉到车辆荷载、风荷…

《安富莱嵌入式周报》第349期:VSCode正式支持Matlab调试,DIY录音室级麦克风,开源流体吊坠,物联网在军工领域的应用,Unicode字符压缩解压

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; 《安富莱嵌入式周报》第349期&#xff1a;VSCode正式支持Matlab调试&#xff0c;DIY录音室级麦克风…

Pyside6(PyQT5)中的QTableView与QSqlQueryModel、QSqlTableModel的联合使用

QTableView 是QT的一个强大的表视图部件&#xff0c;可以与模型结合使用以显示和编辑数据。QSqlQueryModel、QSqlTableModel 都是用于与 SQL 数据库交互的模型,将二者与QTableView结合使用可以轻松地展示和编辑数据库的数据。 QSqlQueryModel的简单应用 import sys from PySid…

uniapp+Vue3(<script setup lang=“ts“>)模拟12306城市左右切换动画效果

效果图&#xff1a; 代码&#xff1a; <template><view class"container"><view class"left" :class"{ sliding: isSliding }" animationend"resetSliding">{{ placeA }}</view><view class"center…

VUE elTree 无子级 隐藏展开图标

这4个并没有下级节点&#xff0c;即它并不是叶子节点&#xff0c;就不需求展示前面的三角展开图标! 查阅官方文档如下描述&#xff0c;支持bool和函数回调处理&#xff0c;这里咱们选择更灵活的函数回调实现。 给el-tree结构配置一下props&#xff0c;注意&#xff01; :pr…

Ansys Motor-CAD:IPM 电机实验室 - 扭矩速度曲线

各位电动机迷们&#xff0c;大家好&#xff1a; 在本博客中&#xff0c;我讨论了如何使用 Ansys Motor-CAD 通过 LAB 模块获取扭矩速度曲线。使用每安培最大扭矩电机控制策略&#xff0c;并涵盖恒定扭矩区域和恒定功率、磁通减弱区域。分析了高转子速度如何影响功率输出。 模型…

网络(三) 协议

目录 1. IP协议; 2. 以太网协议; 3. DNS协议, ICMP协议, NAT技术. 1. IP协议: 1.1 介绍: 网际互连协议, 网络层是进行数据真正传输的一层, 进行数据从一个主机传输到另一个主机. 网络层可以将数据主机进行传送, 那么传输层保证数据可靠性, 一起就是TCP/IP协议. 路径选择: 确…

docker ubuntu:20.04构建c++ grpc环境

由c grpc必须源码编译&#xff0c;ubuntu版本不同可能出现的问题也不同&#xff0c;这里分享下我的构建过程。 我是vscode结合docker去安装c虚拟环境&#xff0c;我不想污染本机环境。 vscode的插件Dev Containers Dockerfile如下(如果单纯是ubuntu环境构建&#xff0c;可忽略该…

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…

MySQL训练营-慢查询诊断问题

慢查询相关参数和建议配置 slow_query_log long_query_time 日志开关&#xff0c;是否记慢查询日志以及超过多长时间判定为慢查询。 查看参数设置&#xff1a; SHOW VARIABLES LIKE ‘slow_query_log’;SHOW VARIABLES LIKE ‘long_query_time’; 实践建议&#xff1a; …

用edge浏览器追剧音量太小?安装音量增强器可解忧

0 源起 春节佳节将至&#xff0c;可以利用这个难得的假期追一追想看而没空看的剧了。 但是在用Edge浏览器播放网页中的视频时&#xff0c;有时音量太小&#xff0c;根本没法听清楚&#xff0c; 遇到这种情况时&#xff0c;尽管Edge浏览器本身没有提供音量控制功能&#xff0…

Linux-arm(1)ATF启动流程

Linux-arm(1)ATF启动流量 Author&#xff1a;Once Day Date&#xff1a;2025年1月22日 漫漫长路有人对你微笑过嘛… 全系列文章可查看专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文档&#xff1a; ARM Trusted Firmware分析——启动、PSCI、OP-TEE接口 Arnold Lu 博…

解决docker: ‘buildx‘ is not a docker command.

简介 buildx 是 Docker 官方提供的一个构建工具&#xff0c;它可以帮助用户快速、高效地构建 Docker 镜像&#xff0c;并支持多种平台的构建。使用 buildx&#xff0c;用户可以在单个命令中构建多种架构的镜像&#xff0c;例如 x86 和 ARM 架构&#xff0c;而无需手动操作多个…

提示词工程(Prompt Engineering)

1. Prompt 是什么&#xff1f; Prompt&#xff1a;提示词&#xff0c;是描述 AI 需要执行的任务的自然语言文本。 如上图所示&#xff0c;Prompt就是用户的提问。其实我们大家都用过Prompt&#xff0c;比如我们使用的ChatGPT、文心一言、豆包等AI产品时的提问就是Prompt&…

【Linux】文件操作、系统IO相关操作、inode和输入输出重定向

⭐️个人主页&#xff1a;小羊 ⭐️所属专栏&#xff1a;Linux 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 1、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作1.4 系统角度 2、系统文件IO2.1 文件相关操作2.2 文件描述符2.3 重定向 3、动静…

头像生成小程序搭建(免费分享)

如下图为小程序页面的基本效果&#xff0c;下面将介绍该小程序的功能 页面template代码如下&#xff1a; <template><view class"avatar-containner"><block v-if"!showCropper"><image class"pageback" src"../../s…

2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点

文章目录 1.朴素二分查找的升级版2.查找左端点3.查找右端点4.代码的编写 1.朴素二分查找的升级版 和之前介绍的这个二分查找相比&#xff0c;我觉得这个区别就是我们的这个二分查找需要找到的是一个区间&#xff0c;而不是这个区间里面的某一个元素的位置&#xff1b; 2.查找…

css命名规范——BEM

目录 引言 BEM是什么? 块Block 元素Element 修饰语Modifier BEM解决了哪些问题? 在流行框架的组件中使用 BEM 格式 实战 认识设计图 如何使用当前的css规范正确命名? 引言 css样式类命名难、太难了,难于上青天,这个和js变量命名还不一样。看看项目中五花八门的样…