Visual Studio调试的技巧

1.什么是bug?

bug:程序漏洞,也就是程序中存在的问题。

2.什么是调试?

当我们发现了程序中的问题后就会解决问题,前提是要找到问题,那么进行调试(debug)以此来找到问题。

3.debug 和 release

在vs里编写代码时就有 debug 和 release 两个选项:

Debug 通常称为调试版本,包含调试信息,但是不会对代码进行优化,可以进行调试的。

Release 称为发布版本,是会对代码自动进行代码优化的,不可以调试,当程序员写好程序后并对程序进行测试,测试完成后就会发布release版本,面向用户使用。没有包含调试信息,所以是不可以进行调试的。

从上面我们就可以知道 debug 版本要比 release 版本要大得多,就是因为debug里面包含调试信息

4.vs调试技巧的快捷键

4.1准备环境

环境就是 vs 的 debug 版本

4.2调试常用的快捷键

F9:创建断点和取消断点

断点的作用是可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执行,之后我们就可以使用 F10、F11 更加深层次的观察代码的执行细节

条件断点:满足这个条件,才触发断点

在下面输入条件:

F5:启动调试,经常用来直接跳到下一个断点处,一般是和F9配合使用。

F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,也可以是一条语句。

F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们进入函数内部,更加仔细地观察语句,此时就必须使用 F11,如果使用 F10 ,直接完成函数调用。

CTRL+F5:开始执行不调试。

5.监视和内存观察

5.1监视

当我们想明白每一个变量变化的每一个过程的时候,我们就可以选择监视,但是监视的前提是一定要调试才可以监视到每一个变量的变化。

 上面的监视窗口任意选一个就行,然后按 F10 就可以观察到了:

上面经历五次循环之后的数组内容

5.2 内存

如果想看数组arr、变量num、变量a的地址可以在地址栏那里写入:arr(数组名本来就是地址)  &num  &a

6.调试举例1

求 1!+2!+3!+4!+...10! 的和,我这里的代码写的是 3 是为了方便检查写的代码是否正确:

(你们运行的时候可以改动一下)

int main()
{int n = 3;int i = 0;int sum = 0;for (n = 1; n <= 3; n++){int ret = 1;for (i = 1; i <= n; i++) {ret = ret * i;}sum +=ret;}printf("%d\n", sum);return 0;
}

7.调试举例2

在VS2022、X86、Debug 的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥?

#include <stdio.h>
int main()
{int i = 0;int arr[10] = {1,2,3,4,5,6,7,8,9,10};for(i=0; i<=12; i++){arr[i] = 0;printf("hehe\n");}return 0;
}

当我们在上面要求的环境中运行时就会发现:

这个时候就要调试看看到底怎么回事?

其实调试到这里我们就可以发现这里是i的地址,当我们再按一次F10时,i 明明该为13了,但是 i 就被初始化为0了,所以才会进入死循环。

本质原因:

栈区内存中习惯是从高地址开始使用,因为先创建的是变量 i 的地址,所以 i 的地址比数组 arr 的地址高,而又因为数组在内存当中的存放是下标越大的,地址越高,也就是从低地址开始使用的,本来数组就越界了,所以有可能数组就会覆盖到 i ,所以进入死循环。而 i 和 arr刚好间隔两个整形的空间,这完全取决于环境,每次的变量在内存的分配都是由编译器指定的,所以演示这道题时规定了环境。

如果将 i 和 arr 初始化的顺序交换一下,就不会出现这种情况了

或者是改成 release 环境下,也不会出现死循环,这是因为 release 会自动地优化代码,但是会报错,因为数组越界了

8.变成常见的错误

8.1 编译型错误:

检查语法的错误——最简单的

8.2链接型错误:

声明自己写的同文件没有写对呀,等等~

8.3运行时错误

前面的两步都没有报错,但是运行的结果和自己预期的结果不一样,这个是最麻烦的,这个时候就要进行调试了

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

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

相关文章

C++ 各种map对比

文章目录 特点比较1. std::map2. std::unordered_map3. std::multimap4. std::unordered_multimap5. hash_map&#xff08;SGI STL 扩展&#xff09; C 示例代码代码解释 特点比较 1. std::map 底层实现&#xff1a;基于红黑树&#xff08;一种自平衡的二叉搜索树&#xff09…

fontTools工具的使用介绍

前言 python工具库fontTools&#xff0c;我是用来压缩前端字体的&#xff0c;优化前端请求速度的&#xff1b;使用的过程中&#xff0c;遇到了不少的坑&#xff0c;把这个过程记录下来&#xff0c;防止再犯。 安装 # fontTools 4.56.0 pip install fontTools提取子字体集 方…

利用大语言模型生成的合成数据训练YOLOv12:提升商业果园苹果检测的精度与效率

之前小编分享过关于《YOLO11-CBAM集成&#xff1a;提升商业苹果园树干与树枝分割的精准度》&#xff0c;改进YOLO11算法后&#xff0c;进行苹果树的实例分割。本期文章我们将分享关于最新的YOLO12算法改进的苹果目标检测。 论文题目&#xff1a;Improved YOLOv12 with LLM-Gen…

设计模式 二、创建型设计模式

GoF是 “Gang of Four”&#xff08;四人帮&#xff09;的简称&#xff0c;它们是指4位著名的计算机科学家&#xff1a;Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides。他们合作编写了一本非常著名的关于设计模式的书籍《Design Patterns: Elements of Reusable…

redis,tar.gz安装后,接入systemctl报错解决

1. WARNING Memory overcommit must be enabled! 这种报错&#xff0c;有两种解决方法 1.1 修改系统参数 编辑 /etc/sysctl.conf 文件&#xff0c;设置 overcommit_memory 为 1 vm.overcommit_memory 11.2 修改redis的最大使用内存 修改配置文件 redis.conf maxmemory 1g…

Python绘图技巧,主流绘图库

一、主流绘图库概览 1. 核心工具对比 库名称特点适用场景Matplotlib基础绘图库&#xff0c;高度可定制科学绘图、论文图表Seaborn基于Matplotlib&#xff0c;统计图表优化数据分布、关系可视化Plotly交互式可视化&#xff0c;支持网页输出仪表盘、动态数据展示Pandas内置简易…

网络安全之前端学习(HTML篇)

前言&#xff1a;网络安全中有一个漏洞叫xss漏洞&#xff0c;就是利用网页引发弹窗&#xff0c;这就要求我们看得懂源码&#xff0c;所以我会持续更新前端学习&#xff0c;可以不精通&#xff0c;但是一定要会&#xff0c;主要掌握HTML&#xff0c;css&#xff0c;js这三项技术…

Qt 多线程设计:死循环与信号槽的权衡

在开发音视频播放器时&#xff0c;多线程设计是不可避免的挑战。音频和视频的解码、播放需要高效运行&#xff0c;同时还要与主线程或其他线程同步&#xff0c;例如通过信号通知播放进度。本文基于一个实际案例&#xff0c;分析了两种线程设计在死循环和信号槽使用中的表现&…

knowledge-微前端(多个前端应用聚合的一个应用架构体系,每个小的应用可独立运行,独立开发,独立部署上线)

1.前言 微前端&#xff0c;将一个大的前端应用拆分为多个小型的&#xff0c;独立开发的前端应用&#xff0c;每一个小型的应用都可以单独的开发&#xff0c;部署和运行。这种结构允许不同的团队使用不同的技术栈来开发应用的不同部分&#xff0c;提高开发的效率与灵活性。 2.实…

工厂函数详解:概念、目的与作用

一、什么是工厂函数&#xff1f; 工厂函数&#xff08;Factory Function&#xff09;是一种设计模式&#xff0c;其核心是通过一个函数来 创建并返回对象&#xff0c;而不是直接使用 new 或构造函数实例化对象。它封装了对象的创建过程&#xff0c;使代码更灵活、可维护。 二、…

旋转位置编码(Rotary Positional Encoding, RoPE):中文公式详解与代码实现

旋转位置编码&#xff08;Rotary Positional Encoding, RoPE&#xff09;&#xff1a;中文公式详解与代码实现 在序列模型中&#xff0c;位置信息对于任务的理解至关重要。传统的绝对和相对位置编码各有优缺点&#xff0c;而RoPE作为一种创新的位置编码方法&#xff0c;展现了…

C语言-指针变量和变量指针

指针 预备知识 内存地址 字节&#xff1a;字节是内存的容量单位&#xff0c;英文名Byte&#xff0c;1Byte8bits 地址&#xff1a;系统为了便于区分每一个字节面对它们的逐一进行编号&#xff08;编号是唯一的&#xff09;&#xff0c;称为内存地址&#xff0c;简称地址。int…

unityAB包(1/2)

unityAB包学习 1.AB包的导出扩展BuildAssetBundleOptions无特殊选项压缩相关选项 2.AB包资源管理3.Resource和AssetBundle加载方式的区别4.预设体5.Unity Asset Bundle Browser 工具5为什么要勾选拷贝到StreamingAsset里面。6.AB包的加载 1.AB包的导出 首先在Project窗口&…

算法——广度优先搜索——跨步迷宫

原题链接 思路&#xff1a;找出最短路径&#xff0c;然后判断是否存在连续三个点是横纵坐标相等的&#xff0c;如果有就步数减1 但是有两个样例过不了 错误原因&#xff1a;在错误的测试案例中&#xff0c;最短路径可能有多条&#xff0c;而我刚好选了一条比较曲折的&#x…

某酒企数字化转型及电商规划项目启动会暨培训会v(60页PPT)(文末有下载方式)

详细资料请看本解读文章的最后内容。 在当今数字化浪潮席卷之下&#xff0c;企业的发展面临着前所未有的机遇与挑战。对于某酒企而言&#xff0c;数字化转型和电商规划已成为其实现 “二次腾飞”、迈向世界级酒企的关键战略举措。本次启动会暨培训会&#xff0c;为该酒企的转型…

NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL

一、NET6的启动流程 区别&#xff1a; .NET6 WebApi第1讲&#xff1a;VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】_vscode webapi-CSDN博客 2、WebApplicationBuilder&#xff1a;是NET6引入的一个类&#xff0c;是建造者模式的典型应用 1>建造者模式的…

vue中根据html动态渲染内容

需求&#xff1a;根据数据中的html&#xff0c;因为我是在做填空&#xff0c;所以是需要将html中的_____替换成input&#xff0c;由于具体需求我使用的是元素contenteditable代替的可编辑的input html部分 <div class"wrap"><component :is"rendered…

【AI】AI编程助手:Cursor、Codeium、GitHub Copilot、Roo Cline、Tabnine

文章目录 一、基本特性对比二、收费标准三、私有部署能力1、Tabnine2、Roo Code 三、代码补全与自然语言生成代码四、安装独立的IDE安装插件安装 五、基本使用&#xff08;一&#xff09;Cursor&#xff08;二&#xff09;GitHub Copilot1、获取代码建议2.聊天1&#xff09;上下…

三轴云台之角速度信号篇

三轴云台的角速度信号主要通过其内置的传感器&#xff08;如陀螺仪&#xff09;来感知和测量。 一、角速度信号的感知与测量 在三轴云台中&#xff0c;陀螺仪是测量角速度的关键组件。它通常安装在三个互相垂直的轴上&#xff08;通常为X、Y、Z轴&#xff09;&#xff0c;能够…

Grid 布局实现三栏布局

使用 CSS Grid 布局实现三栏布局(左右固定 100px,中间自适应)的核心原理是通过网格模板精确控制列宽分配。以下是具体实现方法及优化技巧: 一、基础实现 ​父容器设置 为外层容器添加 display: grid 使其成为网格容器,并通过 grid-template-columns 定义列宽 css .contain…