VS编译器实用调试技巧

news2024/10/3 21:54:02

一.什么是bug

bug本意是"昆虫"或"虫子],现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。“Bug"的创始人格蕾丝.赫柏(Grace Murray Hopper),她是一位为美国海军工作的电脑专家,1947年9月9日,格蕾丝.赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部一组继电器的触点之间有一只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。所以在报告中,赫柏用胶条贴上飞蛾,并把"bug"来表示"一个在电脑程序里的错误”,"Bug"这个说法一直沿用到今天。

那我们发现程序漏洞的时候,该怎么解决呢?接下来我们先讲调试。


二.什么是调试

当我们发现程序中存在的问题的时候,那下一步就是找到问题,并修复问题。
这个找问题的过程叫称为调试,英文叫debug(消灭bug)的意思。
调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离和屏蔽代码的方式,找到问题所的位置,然后确定错误产生的原因,再修复代码,重新测试。

调试是一个动作,找问题的过程,找到这个问题之后解决问题,消灭这个问题。当我们准备调试的时候我们了解一下Debug和 Release。


三.Debug 和Release

在这里插入图片描述
在VS上编写代码的时候,就能看到有 debug和 release 两个选项,分别是什么意思呢?

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序;程序员在写代码的时候,需要经常性的调试代码,就将这里设置为debug,这样编译产生的是debug 版本的可执行程序,其中包含调试信息,是可以直接调试的。

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。当程序员写完代码,测试再对程序进行测试,直到程序的质量符合交付给用户使用的标准,这个时候就会设置为 release,编译产生的就是 release版本的可执行程序,这个版本是用户使用的,无需包含调试信息等。

我们来写代码感受一下什么意思,当我们改成Debug版本的时候。

在这里插入图片描述

打开所在的文件夹
在这里插入图片描述
这里面存放的是编译出的Debug版本的程序。

当我们改成Release

在这里插入图片描述

打开所在的文件夹

在这里插入图片描述
Release文件里存放的是编译出的release版本的程序。

点开 Debug
在这里插入图片描述

点开Release
在这里插入图片描述

从中我们可以看到Debug版本文件大小要比Release版本大,这是因为我们上面说过Debug中含有调试信息。

我们来说一下它两个的区别:Debug版本当我们按F10调试的时候,比如循环会一步一步走,每一步都清清楚楚可以去观察,所有细节都可以看到,而Release版本不会对循环一步一步的走,会直接一趟出结果。

一般我们测试人员测试的是Release版本,而不是Debug版本。那我们到底该如何调试代码呢?请看下面。


四.VS调试快捷键

首先是环境的准备,需要一个支持调试的开发环境,我们使用的是VS,应该把VS上设置为Debug。

调试快捷键

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

VS更多快捷键了解:http://blog.csdn.net/mrlisky/article/details/72622009

要熟练的使用它们,一般F9和F5配合使用的。我们先来看F9,当我们将鼠标按到哪一行,再按一下F9,左边会出现一个红点,如果再按一下F9就取消了,这就是设置断点和取消断点。

在这里插入图片描述

我们看上面的代码,当我们知道该代码出现Bug的时候,同时也知道不是第一个循环的问题,是第二个循环的问题,我们一般用F10进行调试一步一步的走,但是如果第一个循环要循环一万次呢?那我们岂不是要累死了才能一步一步走到第二个循环,所以我们直接在第二个循环处放置断点,当程序运行的时候直接跳到断点第二循环开始。

那怎么跳到断点呢?这个时候我们要用到F5快捷键,所以当我们按F9设置好断点之后,再按F5跳到断点处进行调试,这个时候我们就可以用F10一步一步观察细节了,前面的代码直接跳过,但是也都做完了,我们不观察。

在这里插入图片描述

从上面我们已经介绍过了F10和F11的定义,我们来看一下F10与F11的差异,其实它们两个的差异是谁调试细节更细。

例子

在这里插入图片描述

F10会直接执行函数调用,一步过,不会观察函数里面细节是什么。

在这里插入图片描述

当我们执行到函数语句的时候,按F11会进入函数内部,观察细节,它观察的力度会更细一些。

当我们设置两个断点的时候会出现什么情况呢?

在这里插入图片描述

当我们设置好断点之后,按F5它会它会跳到第一个断点,说明它是根据程序从上往下运行到第一个断点处,当我们再按一次F5它会来到第二个断点吗?

在这里插入图片描述

当我们多次按F5它不会跳到下一个断点,它会跟着循环回到第一个断点,说明F5是让它跳到执行逻辑上的下一个断点,并不是物理上的下一个断点。如果不想要再循环,可以去掉第一个断点,再按F5直接跳到第二个断点。

F10和F11仅仅只是遇到函数有区别,其他情况没有区别,想要进入函数内部观察要用F11,在函数内部一步一步观察的时候,用F10或者F11都可以。

我们也可以设置条件断点,比如想要观察循环第六次是否出现了问题,我们设置条件断点,条件为i == 5,当按下F5的时候,会直接跳到第六次循环开始。

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

这样我们调试会更加快捷,不用再循环很多次才到我们认为出现问题的循环次数。


五.监视和内存观察

在调试的过程中我们,如果要观察代码执行过程中,上下文环境中的变量的值,有哪些方法呢?这些观察的前提条件一定是开始调试后观察,我们来看个例子。

在这里插入图片描述

监视

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

我们按F10一步一步的走,通过监视窗口观察变量,这种过程我们就可以很好的观察变量的值是如何变化的。监视你给它一个合法的表达式也可以帮你计算出结果来。它可以让你很好的观察代码执行过程的变化。

内存

如果监视窗口看的不够仔细,也是可以观察变量在内存中的存储情况,还是在:调试 --> 窗口 --> 内存。打开内存窗口:

在这里插入图片描述

打开内存窗口后,要在地址栏输入:arr,&num,&c,这类地址,就能观察到该地址处的数据。输入的一定要是有效的地址。

在这里插入图片描述

我们打开内存窗口之后,把列设置为4,是为了更好观察变量它们里面的值。

我们来简单介绍一下:中间是它们在内存中的值,虽然在内存中值是以二进制存储的,但是为了方便观察,它是以16进制的形式展示的,左边是它们的地址,右边是对内存中的值进行解析,这解析具有非常少的参考意义。

除此之外,在调试的窗口中还有:自动窗口,局部变量,反汇编,寄存器等窗口,可以自行验证使用一下。


六.编程常见错误归类

编译错误就是语法错误

在这里插入图片描述

链接错误

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

在这里插入图片描述

这些都是链接错误,就是找不到这个符号,但是用了这个符号。
我们来总结一下:编译型错误一般是语法错误,这类错误一般看错误信息就能找到一些蛛丝马迹的,双击错误信息也能初步的跳转到代码错误的地方或者附近。编译错误,随着语言的熟练掌握,会越来越少,也容易解决。

链接型错误:看错误信息,主要在代码中找到错误信息中的标识符,然后定位问题所在,一般是因为:标识符不存在,拼写错误,头文件没包含,引用的库不存在等。

最后还有一个是运行时错误。运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时问题。记住:只有运行时错误能用调试来解决。

最后的最后感谢观看,如果对你有帮助的话,留下你的赞赞吧!!!

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

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

相关文章

算法笔记(七)——哈希表

文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…

堆的代码和基础知识

堆的向上和向下调整-CSDN博客 1.堆的基础知识 2.堆的代码 Heap.h #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> #include<stdbool.h> #include<time.h>// typedef int HPDataType; typedef struct Heap {HPDataTy…

电场磁场,能量密度和平均值(定义式是用实数场计算的,不能直接将定义式里面修改为复数场)

能量密度的定义式&#xff0c;都是实数场 平均能量密度&#xff0c;里面的是复数表示的场。具体推导类似坡印廷矢量 、

4.6章节python中空语句pass保留字作用

在Python中&#xff0c;pass 是一个空语句&#xff0c;它什么也不做。它通常用作占位符&#xff0c;在需要语法上需要一个语句但程序逻辑上不需要执行任何操作的地方。 1.占位符&#xff1a;在编写代码时&#xff0c;如果你还没有决定某个部分应该做什么&#xff0c;可以先用 p…

[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪

【算法介绍】 YOLOv11、ByteTrack和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个…

android RadioButton 设置颜色无效

原因好像是 RadioButton 自动被渲染为 MaterialRadioButton 设置颜色使用这个属性 app:buttonTint“color/black” material-components-android/docs/components/RadioButton.md at master material-components/material-components-android (github.com)https://github.…

【MySQL】SQL介绍+基础+DDL+数据备份+还原

目录 一、DDL建库建表 1. 数据库 2. 内部4特征 3. 外部4特征 4. 数据库结构 5. SQL语句分类&#xff08;重点&#xff09; 6. 注意 7. 数据库表的字段类型 8. 存储引擎 9. 数据库表的操作 二、三范式 1. 什么是范式 2. 约束作用 3. 三范式 4. 第一范式&#xff…

Python从入门到高手4.2节-掌握循环控制语句

目录 4.2.1 理解循环控制 4.2.2 for循环结构 4.2.3 循环结构的else语句 4.2.4 while循环结构 4.2.5 循环结构可以嵌套 4.2.6 国庆节吃好玩好 4.2.1 理解循环控制 我们先来搞清楚循环的含义。以下内容引自汉语词典: 循环意指往复回旋&#xff0c;指事物周而复始地运动或变…

Sharp.js:简单而又实用的图像处理库

前言 在现代Web开发中&#xff0c;图像处理是一个不可或缺的部分。 前端开发者经常需要处理图像&#xff0c;以确保它们在不同的设备和分辨率上都能保持良好的显示效果。 sharp.js是一个高性能的Node.js模块&#xff0c;它利用了libvips库&#xff0c;提供了快速且高效的图像…

网安学习(js漏洞挖掘)

内容来自bili白帽大法师白帽大法师的个人空间-白帽大法师个人主页-哔哩哔哩视频 (bilibili.com) 四种方式 目录 1、JS中存在插件名字&#xff0c;根据插件找到相应的漏洞直接利用 2、JS中存在一些URL链接&#xff0c;根据URL链接找到相应的页面进一步测试和利用 3、JS中存…

《软件工程概论》作业一:新冠疫情下软件产品设计

课程说明&#xff1a;《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论&#xff08;第6版&#xff09;》&#xff08;张海藩等编著&#xff0c;清华大学出版社&#xff09;作为教材。以《软件设计文档国家标准GBT8567-2006》…

Python案例--水仙花数的探索之旅

一、引言 水仙花数&#xff0c;也称为阿姆斯特朗数&#xff0c;是一种特殊的三位数&#xff0c;其各位数字的立方和等于其本身。例如&#xff0c;153就是一个水仙花数&#xff0c;因为 135333153135333153。这种数字的发现不仅展示了数字的内在美&#xff0c;也激发了人们对数…

STM32编码器接口解析及抗噪声措施探讨

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

unity 默认渲染管线材质球的材质通道,材质球的材质通道

标准渲染管线——材质球的材质通道 文档&#xff0c;与内容无关&#xff0c;是介绍材质球的属性的。 https://docs.unity3d.com/2022.1/Documentation/Manual/StandardShaderMaterialParameters.html游戏资源中常见的贴图类型 https://zhuanlan.zhihu.com/p/260973533 十大贴图…

flutter_鸿蒙next(win)环境搭建

第一步 拉取鸿蒙版本flutterSDK仓库 仓库地址&#xff1a;OpenHarmony-SIG/flutter_flutter 第二步 找到拉取的仓库中的README.md 并根据说明配置环境 第三步 配置好环境变量之后 用管理员开启cmd 输入&#xff1a;flutter dcotor 并查看此时flutter所支持的系统 包括&…

Cpp::STL—string类的模拟实现(12)

文章目录 前言一、string类各函数接口总览二、默认构造函数string(const char* str "");string(const string& str);传统拷贝写法现代拷贝写法 string& operator(const string& str);传统赋值构造现代赋值构造 ~string(); 三、迭代器相关函数begin &…

leetcode打卡001-约瑟夫问题

约瑟夫问题 其背景故事是关于一组人站成一个圈&#xff0c;从某个人开始报数&#xff0c;每数到特定数字的人将被淘汰出圈&#xff0c;然后从被淘汰人的下一个人重新开始报数&#xff0c;直到最后剩下一个人。问题的目标是确定最后剩下的那个人在最初的位置。 关键词 递归&a…

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案&#xff1a;A 分析&#xff1a;文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够…

基于单片机人体反应速度测试仪系统

** 文章目录 前言概要设计思路 软件设计效果图 程序文章目录 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师&#xff0c;一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们…

kubernetes基础操作(pod生命周期)

pod生命周期 一、Pod生命周期 我们一般将pod对象从创建至终的这段时间范围称为pod的生命周期&#xff0c;它主要包含下面的过程&#xff1a; ◎pod创建过程 ◎运行初始化容器&#xff08;init container&#xff09;过程 ◎运行主容器&#xff08;main container&#xff…