C++—9、如何在Microsoft Visual Studio中调试C++

       本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内存的操作。

DEBUG是计算机排除故障的意思。马克2号(Harvard Mark II)编制程序的格蕾丝·霍珀(Grace Hopper)是一位美国海军准将及计算机科学家,同时也是世界最早的一批程序设计师之一。有一天,她在调试设备时出现故障,拆开继电器后,发现有只飞蛾被夹扁在触点中间,从而“卡”住了机器的运行。于是,霍珀诙谐地把程序故障统称为“臭虫(BUG)”,把排除程序故障叫DEBUG,而这奇怪的“称呼”,竟成为后来计算机领域的专业行话。如DOS系统中的调试程序,程序名称就叫DEBUG。DEBUG在windows系统中也是极其重要的调试操作。

debug的意思就是清除bug,我们必须诊断出程序出了什么问题?接下来让我们来学习断点和查看内存。

一、创建一个简单的项目

1、这是main.cpp,调用log函数。

2、log.h

3、log函数的定义

二、设置断点

       断点是一个标记,指示 Visual Studio 应在哪个位置挂起运行的代码,以查看变量的值或内存的行为,或确定代码的分支是否运行。 它是调试中最基本的功能。

        我们首先要做的是设置一个断点,然后逐步运行程序。我们可以在程序的任何一行代码上设置断点,当执行到这一行时,它会暂停,它将悬停整个程序,我们可以查看内存情况,一个正在运行的程序,内存几乎是它的全部,所以在诊断程序时能查看内存是非常重要的。因为通过查看内存你可以看到每个变量被设置成什么样子了。

如何插入断点?以下几种方法之一:

1、方法一:

2、方法二:

快捷键F9.

3、方法三:

在下图红圈位置单击。

设置断点的位置会出现一个红圈Breakpoint 。

三、通过调试器运行你的代码

1、确保你处于debug模式下。

       因为你在Release模式下,编译器会改变代码,你的断点有可能永远不被执行,因为你的程序被重新安排了。

2、单击本地Windows调试器

它能确保你在运行的时候附加了调制器。点击前后的变化如下图:

我们的程序将执行,并且变成这种样式。

设置断点的位置红圈上有一个黄色的箭头,指示当前指令指针所在的位置。

本地windows调试器按钮变成了继续按钮,它将像往常一样继续执行程序。

它右边还有三个重要的按钮:

这三个按钮会精确控制程序接下来会发生什么,step into逐语句F11会进入当前函数log,如果有函数,他就在这行代码中,所以这种情况下,我进入log函数。

step over逐过程F10,将转到当前函数的下一条语句。

step out跳出 shift+F11 实际上要跳出当前函数,让我们回到这个函数,在这个例子下,因为这是主函数。

F5:调试状态下运行程序

Ctrl+F5程序运行不调试

F10:逐过程调试(遇到函数调用的地方按F10,会执行函数并跳到函数调用下一句)

F11:逐语句调试,会在函数内部执行,如果不想看函数的执行过程按Shift+F11可跳出函数执行过程。

Shift+F11:跳出函数运行(如执行到一个函数内部,或cout语句定义的地方,此时并不想看这些执行过程,则Shift+F11跳出函数)

F12转到函数定义(把光标定位到一个函数,或变量上,按F12,会调转到函数定义或变量定义的地方

F9断点(把光标定位到相要加断点的那一行,按F9;或者直接在那一行最前面点鼠标左键会出现一个红点)

3、step into逐语句F11来看看发生了什么

程序跳转到这里了,进入log函数的开始位置。

现在可以把鼠标悬停在message变量上并查看它,可以看出这个变量被设置成了hello world!

当我们按F10,运行到下图:

黄色箭头在这一行,意味着它还没有执行这一行。

可以看到hello world!并没有被打印出来。

当我们再按F10的时候来看看运行结果

被打印出来了。

因为我们调用了std::cout函数,它将文本打印到了控制台。

通过设置断点和逐步执行程序,我们可以逐行运行我们的程序。

四、读取内存

1、我们来添加一些变量,让程序变得更有趣一些, 

运行F5

2、我们在主程序的第6行设置断点F9,F5。

我们来看一看a是什么?

为什么它是负的8.58亿?

记住:黄色箭头并不意味着我们运行了这段代码,我们正要运行它,但实际上我们还没有执行第6行,就是实际创建并设置变量的那一行。所以调试器给我们显示的是内存,因为我们还没有把变量设为任何值,它只是一个未初始化的内存,这意味着这个值只是显示给我们,并不是内存实际的值。

3、我们来看看下面这三个重要的窗口。

Autos和Locals基本上只是向你展示局部变量或者对你来说重要的变量。Watch,通常用来监控变量。可以按下变量的名字,回车。

你可以看到显示变量的值了。如果你还想查看string是什么,输入回车就可以。

4、我们有一个视图可以用来查看整个程序的内存,它的打开方式:

它打开的面板如下图:

当你想定位变量a实际存储在程序内存的位置,你只需要知道它的内存地址,要做到这一点,我们只需在Memory1窗口下的Address后面的文本框中输入输入“&”和a,变量名前面的&会取到此变量的内存地址,我们回车,就会被带到变量a的内存地址。

回车之后

这个内存是一大堆“cc”的事实,意味着它是一个未初始化的堆栈内存。 实际上编译器知道我们在尝试创建一个变量,但是我们还没有初始化,它会做一些额外的事情,比如在初始化内存之前将其设置为“cc”,很明显会使速度变慢了。我们不想在release模式中这样做,当我们真正release我们的程序或者发行游戏时,我们不想这样做,但是在调试时,它非常有用。

5、接下来,按下F10,

F10:逐过程调试(遇到函数调用的地方按F10,会执行函数并跳到函数调用下一句)

你会发现4个内存字节被设置为8.每位16进制数字是一个字节8位。

再按F10,

再再按F10,

因为是指针型的,输入指针所指地址,

104正好是十六进制的68.

68 65 6c 6c 6f,在ASCII的解释中,你可以看到它是hello。

继续按F10观察,可输入监视变量,

6、按shift+F11,可跳出当前循环。

Shift+F11:跳出函数运行(如执行到一个函数内部,或cout语句定义的地方,此时并不想看这些执行过程,则Shift+F11跳出函数)

7、但是现在只是想跳出for循环执行后面的语句,怎么办呢?

只需要重新设置断点,按F5就可以。

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

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

相关文章

SpringBoot项目实战(39)--Beetl网页HTML文件中静态图片及CSS、JS文件的引用和展示

使用Beetl开发网页时,在网页中使用的CSS、JS、图片等静态资源需要进行适当的配置才可以展示。大致的过程如下: (1)首先Spring Security框架需要允许js、css、图片资源免授权访问。 (2)网站开发时&#xff0…

GetMaterialApp组件的功能与用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

插入实体自增主键太长,mybatis-plaus自增主键

1、问题 spring-boot整合mybtais执行insert语句时,主键id为长文本数据。 2、分析问题 1)数据库主键是否自增 2)数据库主键的种子值设置的多少 3、解决问题 1)数据库主键设置的时自增 3)种子值是1 所以排查是数据库的问题 4、继…

【嵌入式硬件】嵌入式显示屏接口

数字显示串行接口(Digital Display Serial Interface) SPI 不过多赘述。 I2C-bus interface 不过多赘述 MIPI DSI MIPI (Mobile Industry Processor Interface) Alliance, DSI (Display Serial Interface) 一般用于移动设备,下面是接口…

(STM32笔记)十二、DMA的基础知识与用法 第三部分

我用的是正点的STM32F103来进行学习,板子和教程是野火的指南者。 之后的这个系列笔记开头未标明的话,用的也是这个板子和教程。 DMA的基础知识与用法 三、DMA程序验证1、DMA 存储器到存储器模式实验(1)DMA结构体解释(2…

MySQL 如何赶上 PostgreSQL 的势头?

原文地址 我与 MySQL 社区的前辈交谈时,经常遇到这个问题:「为什么 MySQL 这么棒,而且(至少根据 DB-Engines 的计算)仍然比 PostgreSQL 更流行;但它的地位在下降,PostgreSQL 却势不可挡地越来越…

完全二叉树的删除

(1)删除叶子节点 找到要删除的节点 targetNode找到要删除节点的父节点parent(父节点是否存在)要删除的节点是父节点的左子树还是右子树如果是左子树,则parent.leftnull;如果是右子树则parent.rightnull。 (…

Docker入门之docker基本命令

Docker入门之docker基本命令 官方网站:https://www.docker.com/ 1. 拉取官方镜像并创建容器(以redis为例) 拉取官方镜像 docker pull redis# 如果不需要添加到自定义网络使用这个命令,如需要,直接看第二步 docker r…

玩转大语言模型——ollama导入huggingface下载的模型

ollama导入huggingface模型 前言gguf模型查找相关模型下载模型 导入Ollama配置参数文件导入模型查看导入情况 safetensfors模型下载模型下载llama.cpp配置环境并转换 前言 ollama在大语言模型的应用中十分的方便,但是也存在一定的问题,比如不能使用自己…

DFS之迭代加深、双向DFS、IDA*

迭代加深 迭代加深&#xff1a; 170. 加成序列 满足如下条件的序列 X X X&#xff08;序列中元素被标号为 1 、 2 、 3 … m 1、2、3…m 1、2、3…m&#xff09;被称为“加成序列”&#xff1a; X [ 1 ] 1 X[1]1 X[1]1 X [ m ] n X[m]n X[m]n X [ 1 ] < X [ 2 ] < …

Ansible之批量管理服务器

文章目录 背景第一步、安装第二步、配置免密登录2.1 生成密钥2.2 分发公钥2.3 测试无密连接 背景 Ansible是Python强大的服务器批量管理 第一步、安装 首先要拉取epel数据源&#xff0c;执行以下命令 yum -y install epel-release安装完毕如下所示。 使用 yum 命令安装 an…

【Linux网络编程】第二十二弹---深入理解 I/O 多路转接之 epoll:系统调用、工作原理、代码演示及应用场景

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、I/O 多路转接之 epoll 1.1、epoll 初识 1.2、epoll 的相关系统调用 1.2.1、epoll_create 1.2.2、epol…

双向列表的实现(C++)

一.实现思路 主要是一个空间存储一个数值&#xff0c;然后为了索引后面的数据单元和前面的数据单元&#xff0c;所以在每个空间里面还要存储前面和后面数据单元的指针&#xff0c;就形成了每个数据单元 后面就是要管理的是双向列表的头结点和尾节点&#xff0c;方便实现后面的头…

国产信创实践(国能磐石服务器操作系统CEOS +东方通TongHttpServer)

替换介绍&#xff1a; 国能磐石服务器操作系统CEOS 对标 Linux 服务器操作系统&#xff08;Ubuntu, CentOS&#xff09; 东方通TongHttpServer 对标 Nginx 负载均衡Web服务器 第一步&#xff1a; 服务器安装CEOS映像文件&#xff0c;可直接安装&#xff0c;本文采用使用VMware …

Linux——修改USB网卡设备节点名称

修改驱动&#xff1a; 测试&#xff1a; 参考资料&#xff1a; https://blog.csdn.net/ablexu2018/article/details/144868950

上手体验微软全新整合的王炸平台Fabric

体验确实不错&#xff0c;微软强大的生态能力。 把可视化&#xff0c;数仓&#xff0c;数据胡&#xff0c;数据工厂&#xff0c;机器学习&#xff0c;数据监控等技术都整合到一个平台了。所有数据全都存储在统一的one lake数据中心&#xff0c;消除数据孤岛问题。而且不同角色可…

浅析PCIe链路均衡技术原理与演进

在现代计算机硬件体系的持续演进中&#xff0c;PCIe技术始终扮演着核心角色&#xff0c;其作为连接 CPU 与各类周边设备的关键高速通信链路&#xff0c;不断推动着计算机性能边界的拓展。而 PCIe Link Equalization均衡技术&#xff0c;作为保障数据在高速传输过程中准确性与稳…

东京大学联合Adobe提出基于指令的图像编辑模型InstructMove,可通过观察视频中的动作来实现基于指令的图像编辑。

东京大学联合Adobe提出的InstructMove是一种基于指令的图像编辑模型&#xff0c;使用多模态 LLM 生成的指令对视频中的帧对进行训练。该模型擅长非刚性编辑&#xff0c;例如调整主体姿势、表情和改变视点&#xff0c;同时保持内容一致性。此外&#xff0c;该方法通过集成蒙版、…

Wireshark 学习笔记1

1.wireshark是什么 wireshark是一个可以进行数据包的捕获和分析的软件 2.基本使用过程 &#xff08;1&#xff09;选择合适的网卡 &#xff08;2&#xff09;开始捕获数据包 &#xff08;3&#xff09;过滤掉无用的数据包 &#xff08;4&#xff09;将捕获到的数据包保存为文件…

学习threejs,导入babylon格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.BabylonLoader babyl…