Visual Studio 的调试(一)

news2024/11/16 21:56:14

最近事儿很多昂,更新速度相较以往慢了许多,备考六月份的四级,还有学校的期末等等,事儿真的太多啦,所以后面的更新速度也会放慢一点,实在是抽不开身啊诸位,相当抱歉,还望诸君见谅

言归正传,咱们今天来聊一聊有关VS的调试技巧。调试是相当重要的一点,熟练地运用调试可以帮助我们自身检验代码的可行性,并快速地找出问题所在

一 . Bug

不知道大家第一次认识bug是什么时候昂,我第一次听到这个词还是在小学看陈子豪打CF说的,这也算是他的一个口头禅吧,当时我就只知道bug就是一种类似程序意料之外的漏洞的意思

什么是bug呢?其英文的本意是指“ 虫子 ”,“ 昆虫 ”,而在现在的网络中逐渐被演变成了在我们的电脑系统或程序中,隐藏着一些未被发现的问题,也就是“ 缺陷 ”,“ 漏洞 ”的意思

那么这个时候就有小伙伴要问了,这一演变从何而来呢?Good question!查资料可得:

“Bug” 的创始人是 格蕾丝·赫柏 (Grace Murray Hopper),她是一位为美国海军工作的电脑专家,在1947年9月9日,格蕾丝·赫柏对 Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨⼤的计算机内部⼀组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以在报告中,赫柏用胶条贴上飞蛾,并把 “ bug ”来表示“ 一个在电脑程序里的错误 ” ,从此以后,“ Bug ”这个说法就一直沿用至今

历史上的第一个“ bug ”(图源网络) 

 

二 . Debug 和 Release

Debug就是我们常说的调试,顾名思义调试也就是我们找程序漏洞的一个过程,Debug也就是消灭bug的意思。大家调试一个程序,我们首先是要承认出现了问题,然后我们通过一些手段去定位到问题,可以是逐过程的调试,也可以是隔离和屏蔽代码的方式,当我们找到问题的所在,再确定了问题产生的原因,我们就可以去修复代码了

之前我们就有提到过,在VS中,我们可以选择不同的编译环境,如:Debug 和 Release

Debug 称为调试版本 :它 包含调试信息,并且不作任何优化 ,便于程序员调试程序; 程序员在写代码的时候,需要经常性的调试代码,就将这里设置为 debug ,这样编译产生的是debug 版本的可执行程序,其中包含调试信息,是可以直接调试的
Release 称为发布版本 :它往往是 进行了各种优化,使得程序在代码大小和运行速度上都是最优的 ,以便用户很好地使用。当程序员写完代码,测试员再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为 release ,编译产生的就是 release 版本  的可执行程序, 这个版本是用户使用的,所以无需包含调试信息等 (如果大家感兴趣的话,可以试着将一个文件分别用 Debug 和 Release保存,我们会发现 Debug版本的所占内存会大一些,这就是因为Debug版本包含了调试信息等

 

三 . VS的调试快捷键

在VS中有着各式各样的快捷键,我这里给大家列举几个常用的、有代表性的:

F10:逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部
在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,直接完成函数调用
F9:创建断点和取消断点
断点的作用 :可以在程序的任意位置设置断点,打上断点就可以使得程序执行到想要的位置暂停执执行,接下来我们就可以使用F10,F11这些快捷键,观察代码的执行细节
条件断点 :满足这个条件,才触发断点
F5:启动调试,经常用来直接跳到下一个断点处,一般是和F9配合使用
CTRL + F5:开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用
(一般我们运行代码都用这个快捷键)
VS更多快捷键了解:http://blog.csdn.net/mrlisky/article/details/72622009

四 . 监视和内存观察

在我们开始调试后,在菜单栏中,调试——>窗口——>监视,我们任意打开一个监视窗口,输入我们想要监视的对象,如:

在监视窗口中观察各项数据:

我们按F10,输入想要监视的对象,然后我们再按一次F10,即可进行到下一条语句,以此类推,直到程序结束跳出

 若是大家觉得我们在监视窗口中观察的还不够细致时,我们可以进入内存中去观察变量在内存中的储存情况,如:

在我们的内存窗口中就可以观察到:

在这里的自动的选项我们可以设置一行显示几列(我们一般会设置为4列):

除此之外,在我们的调试的窗口中还有:自动窗口,局部变量,反汇编、寄存器等窗口,我这里就不一 一为大家赘述, 诸君感兴趣的话可以自行去搜集影视资料学习。

 五 . 有关调试的举例

为了让大家加深对调试概念的理解,咱们在这里用一个经典例题练练手:

大家可以试着想想运行结果是什么?

这个程序运行起来很显然是会死循环的,这一点相信诸君都能看得出来,这题的关键是我们怎么去理解它为什么死循环,用官方的话术解释清楚问题的根本

当我们调试运行到第十个 hehe 的时候还一切正常,但当我们继续的时候,程序可以无休止的打印hehe,大家自己去运行可以发现,最下面的光标是在一直闪烁的,这就证明程序一直在进行,在无休止的打印,像这样:


这个时候就有小伙伴要问了,这也没有报错啊,代码怎么就有问题了呢?

大家要注意,这个代码肯定是错误的,我们数组arr中只能存10个整型,也就是说,当我们 i 变成10的时候,就已经越界访问了,再向后越界访问,我们就有可能覆盖到 i 的地址,从而导致程序的死循环。至于为什么没有报错呢?那是因为程序死循环了嘛,它一直忙着打印 hehe 呢,吃了炫迈一样,根本停不下来,所以来不及报错

此题其内存布局如图:

(1)栈区内存的使用习惯是从高地址向低地址使用的,所以变量i的地址是较大的,及arr数组的地址整体是小于 i 的地址

注意:在VS上切换到X64版本,这个使用的顺序是相反的,在Release版本的程序中,这个使用的顺序也是相反

(2)数组在内存中的存放是:随着下标的增长,地址是由低到高变化

由此可见,在此题中, 随着数组下标的增长,往后越界就有可能覆盖到 i 的地址 ,这样就可能造成死循环

 

这里可能有小伙伴要问了:为什么 i 和 arr 数组之间恰好空出来2个整型的空间呢?这里确实是巧合,在不同的编译器下可能中间的空出的空间大小是不一样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以的不同的编译器之间就有差异了,这也就是为什么题目在一开始就会告诉我们是在Debug 、x86环境下进行

这个理解我们就能够清楚的体会到调试的重要性,只有调试才能观察到程序内部执行的细节,就像医生给病人做B超,CT一样
总结:调试是需要反复去动手练习的,诸君一定要自己动手多调试,从中汲取经验。调试是可以增加程序员对代码的理解和掌控的,掌握了调试的能力,就能看到本质,对程序内部一览无余。熟练的掌握调试技巧是一个优秀的程序员的必备技能

OKK,有关VS中调试的相关知识就给大家聊到这里了。 程序运行时的错误,是千变万化的,这个时候我们可以借助调试,去逐步定位每条语句的问题,调试观察并解决我们程序在运行时出现的问题。当然了,这肯定不是一日之功嘛,而是一个日积月累的过程,无他唯手熟尔。无需多言,诸君记得勤练手,咱们共勉!!!下期再见,886!

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

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

相关文章

Dockerfile文件详细介绍

前言 Dockerfile是一个文本文件,包含了用于构建Docker镜像的所有命令和说明。它定义了容器的运行环境、依赖以及启动方式,是创建Docker镜像的核心部分。 由于制作镜像的过程中,需要逐层处理和打包,比较复杂,所以Docke…

Midjourney Describe API 使用文档

Midjourney Describe API 使用文档 Midjourney Describe API 的主要功能是通过上传图片,获取对图片的描述。使用该 API,只需要传递图片文件,API 会返回图片的详细描述。无需繁琐的参数设置,即可获得高质量的图片描述。 支持多种图…

腾讯Java社招面试题真题,最新面试题

Java中synchronized和ReentrantLock有什么区别? 1、锁的实现方式不同: synchronized是JVM层面的锁,主要依赖于监视器对象(monitor)实现。ReentrantLock是JDK层面的锁,通过Java代码实现,提供了更…

陪跑真正值钱的不是教程,是你遇到那个挡住你的问题时,身边有个靠谱的人

今天分享两个概念,一个是意识决定一切,一个是大道至简,做项目就是按部就班的遵循事情发展规律去做。 先说第一个概念,意识决定一切。我们说的凡事预则立不预则废,就是计划了去做就会有结果。 给你们一个表,…

力扣:1738. 找出第 K 大的异或坐标值

1738. 找出第 K 大的异或坐标值 给你一个二维矩阵 matrix 和一个整数 k &#xff0c;矩阵大小为 m x n 由非负整数组成。 矩阵中坐标 (a, b) 的 值 可由对所有满足 0 < i < a < m 且 0 < j < b < n 的元素 matrix[i][j]&#xff08;下标从 0 开始计数&…

简单的UDP网络程序:多人群聊系统

本章重点 能够实现一个简单的udp客户端/服务器; 1.创建套接字 我们把服务器封装成一个类&#xff0c;当我们定义出一个服务器对象后需要马上初始化服务器&#xff0c;而初始化服务器需要做的第一件事就是创建套接字。 ⭐参数说明&#xff1a; domain&#xff1a;创建套接字的域…

Spring中的Aware接口

Spring中的Aware接口 Aware接口介绍 Aware是Spring中的接口&#xff0c;它的作用是可以让Bean获取到运行环境的相关信息。比如获取到上下文、Bean在容器中的名称等。 Spring中提供了很多Aware接口的子类&#xff0c;具体如下&#xff1a; 常用接口的作用如下&#xff1a; …

设计软件有哪些?建模和造型工具篇(1),渲染100邀请码1a12

之前我们介绍的都是渲染软件&#xff0c;但对于设计师来说建模和造型是在渲染之前&#xff0c;所以从现在开始&#xff0c;我们会介绍一批建模和造型工具。 1、ZBrush ZBrush是由Pixologic公司开发的数字雕刻和绘画软件&#xff0c;专为艺术家和设计师而设计。它结合了3D建模…

Python打包篇-exe

文章目录 pyinstallerauto-py-to-exe pyinstaller 命令行工具&#xff0c;语法自行查看官方help pip install pyinstallerauto-py-to-exe 基于pyinstaller的一款GUI工具&#xff0c;会自行打包py文件中依赖的库 pip install auto-py-to-exe auto-py-to-exe.exe //运行即可

【教程】Linux部署Android安卓模拟器

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 未完成&#xff0c; 先简单记录下指令。 docker-android https://github.com/budtmo/docker-android 检查系统是否支持&#xff1a; sudo apt instal…

Linux网络编程:HTTPS协议

目录 1.预备知识 1.1.加密和解密 1.2.常见加密方式 1.2.1.对称加密 1.2.2.非对称加密 ​编辑 1.3.数据摘要&#xff08;数据指纹&#xff09;和数据签名 1.4.证书 1.4.1.CA认证 1.4.2.证书和数字签名 2.HTTPS协议 2.1.自行设计HTTPS加密方案 2.1.1.只使用对称加密 …

【微机原理及接口技术】可编程并行接口芯片8255A

【微机原理及接口技术】可编程并行接口芯片8255A 文章目录 【微机原理及接口技术】可编程并行接口芯片8255A前言一、8255A的内部结构和引脚1.与外设接口&#xff08;数据端口&#xff09;2.与处理器接口 二、8255A的工作方式三、8255A的编程1. 写入方式控制字&#xff1a;控制字…

[GUET-CTF2019]encrypt

我自己大致分析的是输入flag然后先 RC4加密再 base64加密&#xff0c;解了一下发现不对。 那就只能仔细分析了&#xff0c;看有没有魔改 嗯&#xff0c;可以动调试试&#xff0c;嗯就是要找其 key 的值 &#xff1a;0x10,0x20,0x30,0x30,0x20,0x10,0x40 aaaaaaaaaa--->dd…

HTML.

HTML:超文本标记语言&#xff08;Hyper Text Markup Language&#xff09; 超文本&#xff1a;不同于普通文本&#xff0c;可以定义图片&#xff0c;音频&#xff0c;视频等内容 标记语言&#xff1a;由标签构成的语言 HTML标签都是预定义好的HTML代码直接在浏览器中运行&#…

Llama 3没能逼出GPT-5!OpenAI怒“卷”To B战场,新企业级 AI 功能重磅推出!

Meta 是本周当之无愧的AI巨星&#xff01;刚刚推出的 Llama 3 凭借着强大的性能和开源生态的优势在 LLM 排行榜上迅速跃升。 按理说&#xff0c;Llama 3在开源的状态下做到了 GPT-3.7 的水平&#xff0c;必然会显得用户&#xff08;尤其是企业用户&#xff0c;他们更具备独立部…

ISCC2024个人挑战赛WP-WEB

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…

【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构

文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…

大数据信用报告查询有哪些作用?哪个平台更好?

大数据信用是基于大数据技术&#xff0c;通过大数据系统生成的大数据信用报告&#xff0c;报告收集了查询人在非银环境下的申贷数据以及履约行为和信用风险的综合性报告。很多人都会问&#xff0c;大数据信用报告查询有哪些作用?哪个查询平台更好的疑问&#xff0c;下文就详细…

【教学类-58-04】黑白三角拼图04(2-10宫格,每个宫格随机1张-6张,带空格纸)

背景需求&#xff1a; 前期制作了黑白三角拼图2*2、3*3、4*4&#xff0c;确定了基本模板&#xff0c;就可以批量制作更多格子数 【教学类-58-01】黑白三角拼图01&#xff08;2*2宫格&#xff09;固定256种随机抽取10张-CSDN博客文章浏览阅读522次&#xff0c;点赞13次&#x…

【JavaEE】深入学习Spring MVC:掌握参数传递与映射

目录 3. 请求传递单个参数传递多个参数传递对象后端参数重命名传递数组传递集合 3. 请求 请求就是要学习如何传参 传递单个参数多个参数对象数组/集合…… 传递单个参数 RequestMapping("/m1") public String m1(String name){return "接收到的参数name:&qu…