Visual Studio 2022 程序员必须知道高效调试手段与技巧(中)

news2024/11/15 15:42:21

在这里插入图片描述

🎬 鸽芷咕:个人主页

 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》

⛺️生活的理想,就是为了理想的生活!

文章目录

  • 📋 前言
  • 💬 调试的时候查看程序当前信息
    • 💭 查看临时变量的值
    • 💭 查看内存信息
      • 💻 调试实例:为什么变量不初始化是随机值
    • 💭 查看调用堆栈
    • 💭 查看汇编信息
    • 💭 查看寄存器信息
  • 💬 多多动手,尝试调试,才能有进步
  • 📝全篇总结

📋 前言

  🌈hello! 各位宝子们大家好啊,上一章给大家介绍了 Visual Studio 2022 快捷键和 版本介绍,今天就来给大家来点干货
  ⛳️今天来正式来调试环节,带大家一起看一下在调试时如何查看程序中临时变量的值以及调用堆栈和内存信息等 !
  📚本期文章收录在《学习工具》,大家有兴趣可以看看呐
  ⛺️ 欢迎铁汁们 ✔️ 点赞 👍 收藏 ⭐留言 📝!

🔥 注:前一篇文章在这里《高效调试手段与技巧(上)》

💬 调试的时候查看程序当前信息

💭 查看临时变量的值

在调试开始之后,用于观察变量的值。我们只需要选中监视窗口就可以查看我们程序在运行中的值了,从而块速排查错误!

  • 一旦发现储存的值和我们预期的不一样就可以进行
  • 更改我们的代码从而快速找到错误

在这里插入图片描述

把监视窗口打开之后,就可以输入变量名去监视我们的变量值了!

在这里插入图片描述

💭 查看内存信息

内存的窗口调用和监视是一样,内存窗口可以让我们查看在内存中一个数据是怎么存储的,提供了一个比较好的交互界面!

在这里插入图片描述

到了这里就需要我们给编辑器一个地址了,这样它才能找到我们需要找到变量的地址。去观察它的内存分布情况,还可以把要观察的列设置为我们想要观察的数量

  • int 类型的变量占4个字节所以我们就只观察4列
    -== 在这里一列代表一个字节==

在这里插入图片描述
在这里插入图片描述

💻 调试实例:为什么变量不初始化是随机值

我们在创建临时变量的时候如果没有进行初始化,打印出来就是随机值,而有了内存观察我们就可以看到为什么临时变量不赋值是初始值了!

  • 因为我们临时变量是在栈空间的,所以一些临时变量
  • 出了自己的作用域就会销毁,但值不会改变只是把空间还给操作系统
  • 而我们一旦新开辟的临时变量在原来用过的地址上创建的
  • 那么就会是原来空间的值所以是随机的!

🔥 注:关于栈空间和 其他空间我们在 《C/C++内存分配的几个区域》有详细讲解!

在这里插入图片描述

这里我们就可以看到栈区的有些空间是随机值,所以在创建变量的时候一定要赋初值

💭 查看调用堆栈

调用堆栈这方面的功能我们在函数栈帧的创建于销毁,还有数据结构 空间复杂度是可以帮助我们很好的理解栈区和堆区的空间消耗和调用的!

  • 这里可以反应的是我们函数的调用关系逻辑
  • 数据结构里面的栈 就和我们调用堆栈差不多

在这里插入图片描述

在这里插入图片描述

💭 查看汇编信息

  ⛳️ 这里面可以查看我们程序在转换成汇编代码是怎么样的?比如函数调用时怎么样的啊! for循环的转换成功汇编的代码是什么都可以观察!

在这里插入图片描述
在这里插入图片描述

💭 查看寄存器信息

这里就可以观察我们程序在运行时寄存器的变化!

在这里插入图片描述

在这里插入图片描述

💬 多多动手,尝试调试,才能有进步

好了到了这里常用的调试技巧就个大家讲解完了,但是光看还不行我们程序出现问题一定要多去调试。这样才能知道问题到底出在哪里,以后及时避免!

  • 一定要熟练掌握调试技巧。
  • 初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。
  • 我们所讲的都是一些简单的调试。
  • 以后可能会出现很复杂调试场景:多线程程序的调试等。
  • 多多使用快捷键,提升效率。

📝全篇总结

✅ 归纳:
☁️ 关于调试的技巧我们讲完了,下一篇就给大家讲讲一些调试实例,只有用起来才会真正学会!
看到这里了还不给博主扣个:
⛳️ 点赞☀️收藏 ⭐️ 关注

💛 💙 💜 ❤️ 💚💓 💗 💕 💞 💘 💖
拜托拜托这个真的很重要!
你们的点赞就是博主更新最大的动力!
有问题可以评论或者私信呢秒回哦。
在这里插入图片描述

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

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

相关文章

实验报告-Sublime配置默认语法,以配置Verilog语法为例

实验报告-Sublime配置默认语法,以配置Verilog语法为例 1,下载Verilog语法环境2,Sublime配置语法工作环境,以Verilog语法环境为例。3,打开一个新的Sublime,验证编辑器配置Verilog为默认语法成功!4,Sublime汉化1,下载Verilog语法环境 参考文献: 1,Sublime Text 4加载…

29.Git版本控制工具

1.Git简介 Git是一开源的分布式版本控制系统,提供了存储代码、管理版本历史、分支和合并等功能。 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。它的主要目的是跟踪和记录软件开发过程…

【2500. 删除每行中的最大值】

来源:力扣(LeetCode) 描述: 给你一个 m x n 大小的矩阵 grid ,由若干正整数组成。 执行下述操作,直到 grid 变为空矩阵: 从每一行删除值最大的元素。如果存在多个这样的值,删除其…

手把手教你写代码——基于控制台的通讯录管理系统(单表)

栏目介绍 本栏目专为入门java学习者设计的一些简单的入门项目 功能介绍 本项目为简单的基于控制台的通讯录管理系统,所需要的环境仅仅为jdk以及mysql(版本不限)!只有一个简单的eclipse软件以及我们的mysql可视化工具(视…

企业网关:打开商业大门的关键

企业网关:打开商业大门的关键 在当今数字化时代,企业网关的重要性变得越来越明显。作为连接企业内外的关键枢纽,企业网关不仅提供了安全可靠的网络连接,还为企业提供了更高效的业务运营和更好的客户体验。本文将深入探讨企业网关…

Vue-路由

一、目标 能够说出前端路由工作的过程能够知道如何在vue3中配置路由能够知道如何使用嵌套路由能够知道如何实现动态路由匹配能够知道如何使用编程式导航能够知道如何使用导航守卫 二、目录 前端路由的概念与原理vue-router的基本使用vue-router的高级用法后台管理案例 前端…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具:Ubuntu下Questasim10.7安装(64bit)全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接,后面激活文件参考的第二个 另外…

JavaScript 常用数组方法之数组扁平化「赶紧收藏」

一、什么是数组扁平化 数组扁平化,就是将一个复杂的嵌套多层的数组,一层一层的转化为层级较少或者只有一层的数组。 比如: // 多维数组 var arr [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; // 数组扁平化 [1,2,3,4,5,6,7,8,9,10,11,12]二、实现…

关于在Python的for循环中改变列表的值问题探究

案例一: def test():a [1, 2]for i in a:print(i, id(a))if i 5:breaka [a[0]2, a[1]2] 输出: 1 4313456192 2 4313269056 解释: 在for循环语句中的变量a使用的内存地址为4313456192,这个地址以及存储的值不会因为a的重新赋…

ceph-mon运行原理分析

一、流程:ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1)通过命令创建ceph-mon,命令为:ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

【Jenkins系列】-Pipeline语法全集

Jenkins为您提供了两种开发Pipeline的方式:脚本式和声明式。 脚本式流水线(也称为“传统”流水线)基于Groovy作为其特定于域的语言。而声明式流水线提供了简化且更友好的语法,并带有用于定义它们的特定语句,而无需学习…

金融行业软件测试面试题及其答案

下面是一些常见的金融行业软件测试面试题及其答案: 1. 什么是金融行业软件测试? 金融行业软件测试是针对金融领域的软件系统进行验证和确认的过程,旨在确保软件在安全、稳定、可靠和符合法规要求的条件下运行。 2. 解释一下金融软件中的风险…

golang,gin框架的请求参数(一)--推荐

golang,gin框架的请求参数(一) gin框架的重要性不过多的强调,重点就gin使用中的参数传递,获取进行梳理文件,满足使用需求。 获取前端请求参数的几种方法: 一、获取参数【浏览器地址获取参数】…

linux的一些基本指令第二期

rm rm -r 你要删除的目录名 加了-r 之后表示递归删除你要删除的目录 使用这个命名之后,他会一边递归到叶子节点,一边询问你是否要删除,然后会递归回来,在回来的途中删除: rm -rf 你要删除的目录名 强制执行删除操作…

权威认证!伙伴云入选亿欧2023AIGC应用场景创新TOP50榜单

近日, 知名科技与产业创新服务平台【亿欧】发布2023年度AIGC应用场景创新TOP50榜单。 伙伴云作为行业领先的零代码应用搭建平台,率先推出AI智能搭建系统功能,并将Chat GPT应用嵌入伙伴云应用在解决方案层,最终凭借前沿的技术创新力和突出的数…

【NVMe2.0d 17 - 1】Reservation 核心命令

文章目录 Reservation RegisterReservation AcquireReservation ReportReservation Release Reservation Register Reservation Register命令用于注册、取消注册或替换reservation key。 该命令使用Command Dword 10和内存中的Reservation Register data structure 如果该命…

基于seaborn.countplot的柱状图显示Y值及填充形状

参考链接: seaborn 柱状图上显示y值的方法 python柱形图填充 figs,ax plt.subplots(figsize(10,4)) fig sns.countplot(x"状态",hue"等级", datadatas)// 不可通过设置hatch参数来设置 marks ["o","---","***&quo…

IDEA批量启动多个微服务

注:现在盛行微服务开发,通常需要通过idea启动多个项目,每次都一个一个的启动,太麻烦了,不过被担心idea帮我们考虑到这个了(不用安装插件哦) 配置步骤: 将需要一次性全部启动的微服务…

[STL]详解vector模拟实现

[STL]vector模拟实现 文章目录 [STL]vector模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1构造函数2构造函数3拷贝构造函数析构函数 4. 迭代器相关函数begin函数end函数begin函数const版本end函数const版本 5.容量相关函数size函数capacity函数reserve函数re…

【Nodejs】操作mongodb数据库

1.简介 Mongoose是一个让我们可以通过Node来操作MongoDB的模块。Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。在大多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并…