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、方法三:
在下图红圈位置单击。

设置断点的位置会出现一个红圈
。
三、通过调试器运行你的代码
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就可以。
相关文章:
C++—9、如何在Microsoft Visual Studio中调试C++
本文通过实例操作来介绍 Visual Studio 调试器的功能。调试器在运行过程中可提供许多方法让你查看代码的情况。 你可以逐步浏览代码、查看变量中存储的值、设置对变量的监视以查看值何时改变、检查代码的执行路径、查看代码分支是否正在运行等等。本实例主要是设置断点及查看内…...
11. C 语言 作用域与变量使用技巧
本章目录: 前言一、作用域的分类局部变量示例: 全局变量示例:示例: 形式参数示例: 二、作用域的细节与常见误区块级作用域示例: 静态变量与全局变量的对比示例: 未初始化变量的影响示例: 三、实…...
【机器学习案列】学生抑郁可视化及预测分析
🧑 博主简介:曾任某智慧城市类企业算法总监,目前在美国市场的物流公司从事高级算法工程师一职,深耕人工智能领域,精通python数据挖掘、可视化、机器学习等,发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...
Perl语言的循环实现
Perl语言的循环实现 引言 Perl是一种强大的脚本语言,以其灵活的语法和强大的文本处理能力著称。无论是在系统管理、网络编程,还是在Web应用开发中,Perl都广泛应用于各种领域。循环是编程语言中一个极其重要的概念,它允许程序重复…...
SpringBoot项目——使用Spark对爬虫爬取下的数据进行清洗
随着互联网信息呈爆炸式增长,爬虫技术被广泛用于从海量网页中抓取有价值的数据。然而,爬取到的数据往往存在格式不规范、重复、噪声等诸多问题,需要高效的数据清洗流程来保障数据质量,Spark 在其中发挥了关键作用。 什么是Spark …...
分布式锁 Redis vs etcd
为什么要实现分布式锁?为什么需要分布式锁,分布式锁的作用是什么,哪些场景会使用到分布式锁?分布式锁的实现方式有哪些分布式锁的核心原理是什么 如何实现分布式锁redis(自旋锁版本)etcd 的分布式锁(互斥锁(信号控制)版本) 分布式锁对比redis vs etcd 总结 为什么要实现分布式…...
《深度剖析:开源与闭源模型,AI舞台上的不同角色》
在人工智能蓬勃发展的当下,模型的选择如同为一场战役挑选合适的武器,至关重要。开源模型与闭源模型作为AI领域的两大阵营,在性能和应用场景上展现出显著差异,深刻影响着开发者、企业以及整个行业的走向。 性能差异:实…...
Angular结合C#
在 Angular 2 及以上版本与 C#结合使用 REST API 的示例中,我们将分别展示前端 Angular 服务和后端 C# Web API 的实现。 一、前端:Angular 服务 生成 Angular 服务 使用 Angular CLI 生成一个新的服务,例如user.service.ts: ng…...
Spring——自动装配
假设一个场景: 一个人(Person)有一条狗(Dog)和一只猫(Cat),狗和猫都会叫,狗叫是“汪汪”,猫叫是“喵喵”,同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…...
Servlet与JSP:Java的秘密花园入口
1 Servlet概述 Servlet是Java Web应用中的一个核心组件,它是一个运行在服务器端的Java程序,可以响应客户端的请求并生成响应。Servlet为Web应用提供了一个统一的接口来处理HTTP请求。 2 Servlet的生命周期 Servlet的生命周期包括以下几个阶段ÿ…...
【Linux】Linux常见指令(上)
个人主页~ 初识Linux 一、Linux基本命令1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令7、rm指令8、man指令9、cp指令10、mv命令 Linux是一个开源的、稳定的、安全的、灵活的操作系统,Linux下的操作都是通过指令来实现的 一、Linux基本命令 先…...
ELFK日志采集实战
一、日志分析概述 日志分析是运维工程师解决系统故障,发现问题的主要手段 日志主要包括系统日志、应用程序日志和安全日志 系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因 经常分析日志可以了解服务器的负荷&#x…...
Kubernetes 使用自定义资源(CRD)扩展API
K8s CRD 即 Kubernetes CustomResourceDefinition,是 Kubernetes 提供的一种扩展机制,允许用户在 Kubernetes 集群中定义和使用自定义的资源类型。通过定义 CRD,用户可以在 Kubernetes 集群中创建、读取、更新和删除自定义资源对象࿰…...
用户使用LLM模型都在干什么?
Anthropic 对用户与 Claude 3.5 Sonnet 的大量匿名对话展开分析,主要发现及相关情况如下: 使用用途分布 软件开发主导:在各类使用场景中,软件开发占比最高,其中编码占 Claude 对话的 15% - 25%,网页和移动应…...
MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)
MySQL常用命令汇总 简介 MySQL是一个广泛使用的开源关系型数据库管理系统,由瑞典的MySQL AB公司开发,现属于Oracle公司。 MySQL支持SQL(结构化查询语言),这是数据库操作的标准语言,用户可以使用SQL进…...
六年之约day10
今日开心∶今天部门开了个颁奖大会,看着别人收获的荣誉,还真有些羡慕,什么时候,我也能拥有属于自己的荣誉啊. 今日不开心∶活没干多少,对业务也不是很懂 今日思考∶很多事情,存在即合理.工作,…...
springboot和vue配置https请求
项目场景: 代码发布到线上使用https请求需要配置ssl证书,前后端都需要修改。 问题描述 如图,我们在调用接口时报如下错误,这就是未配置ssl但是用https请求产生的问题。 解决方案: 前端:在vite.config.js文…...
selenium遇见伪元素该如何处理?
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 问题发生 在很多前端页面中,大家会见到很多::before、::after 元素,比如【百度流量研究院】: 比如【百度疫情大数…...
慧集通(DataLinkX)iPaaS集成平台-数据质量
1.什么是数据质量 介绍: 数据质量的主要作用就是记录组件写入的数据,及执行时的相关信息,如执行的最终状态(成功,失败,进行中等),执行的时间(创建时间,修改时…...
微软发布AIOpsLab:一个开源的全面AI框架,用于AIOps代理
在当今这个云计算技术迅猛发展的时代,企业面临着前所未有的挑战与机遇。随着云基础设施的日益复杂化,它们成为了企业运营不可或缺的支柱。网站可靠性工程师(Site Reliability Engineers,简称SRE)和DevOps团队肩负着关键…...
中文文献管理效率提升指南:茉莉花插件的全方位应用
中文文献管理效率提升指南:茉莉花插件的全方位应用 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件,用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 在学术研究与文献管…...
告别黑盒:手把手教你用Field II和USTB工具箱搭建CPWC超声仿真环境(附完整代码)
从零构建CPWC超声仿真环境:Field II与USTB工具箱实战指南 引言:为什么需要可复现的超声仿真环境? 在医学超声成像研究中,仿真技术扮演着越来越重要的角色。无论是算法验证、系统设计还是教育培训,一个稳定可靠的仿真环…...
React Hot Toast 终极指南:如何集成 Font Awesome 与 Material Icons 自定义图标
React Hot Toast 终极指南:如何集成 Font Awesome 与 Material Icons 自定义图标 【免费下载链接】react-hot-toast Smoking Hot React Notifications 🔥 项目地址: https://gitcode.com/gh_mirrors/re/react-hot-toast 想要让你的 React 应用的…...
CRMEB小程序订阅消息配置避坑指南:从PHP环境搭建到消息同步全流程
CRMEB小程序订阅消息配置避坑指南:从PHP环境搭建到消息同步全流程 在当今的小程序生态中,订阅消息已经成为商家与用户互动的重要桥梁。CRMEB作为一款优秀的开源电商系统,与微信小程序订阅消息的集成却常常让开发者踩坑无数。本文将带你从零开…...
obsidian claudian 插件配置使用minimax模型
首先,打开.claude/settings.json文件 sudo gedit .claude/settings.json参考官网配置 “ANTHROPIC_BASE_URL”: “https://api.minimaxi.com/anthropic”, “ANTHROPIC_AUTH_TOKEN”: “MINIMAX_API_KEY”, 等参数然后在claudian插件中在配置一遍,即可正…...
SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库
SecGPT-14B知识库增强:让OpenClaw支持最新CVE漏洞库 1. 为什么需要给OpenClaw注入CVE知识库 去年处理Log4j2漏洞时,我遇到了一个尴尬场景:当我让OpenClaw帮我检查服务器是否存在CVE-2021-44228漏洞时,它给出的回答是"未找到…...
STM32duino驱动VL53L8CX多区ToF传感器实战指南
1. 项目概述X-NUCLEO-53L8A1 是意法半导体(STMicroelectronics)推出的面向 STM32 Nucleo 开发平台的扩展板,核心器件为 VL53L8CX —— 业界首款支持 88 多区域(multizone)测距的飞行时间(Time-of-Flight, T…...
【MATLAB源码-第410期】基于matlab的图像去雾系统设计—采用暗通道先验、颜色衰减与导向滤波融合。
操作环境:MATLAB 2024a1、算法描述基于MATLAB的图像去雾系统设计与实现 摘要 雾霾天气会显著削弱成像系统获取场景信息的能力,使图像出现对比度下降、颜色失真、边缘模糊及远景细节衰减等问题,从而影响目标检测、场景理解、智能监控与辅助驾驶…...
Kubernetes集群的监控告警最佳实践
Kubernetes集群的监控告警最佳实践 🔥 硬核开场 各位技术老铁,今天咱们聊聊Kubernetes集群的监控告警最佳实践。别跟我扯那些理论,直接上干货!在云原生时代,监控告警是系统可靠性的关键,它能帮助我们及时发…...
虚拟机检测工具VMDE深度解析与实战指南
虚拟机检测工具VMDE深度解析与实战指南 【免费下载链接】VMDE Source from VMDE paper, adapted to 2015 项目地址: https://gitcode.com/gh_mirrors/vm/VMDE 揭示VMDE的核心价值 在虚拟化技术广泛应用的今天,准确识别系统运行环境的真实性变得至关重要。虚…...
