VS里那些实用的调试(debug)技巧

news2024/12/26 13:33:02

前言——————希望现在在努力的各位都能感动以后享受成功的自己!


首先我们要来了解什么是bug——————bug本意是“昆虫”或“虫子”,现在⼀般是指在电脑系统或程序中,隐藏着的⼀些未被发现的缺陷或

问题,简称程序漏洞。

“Bug” 的创始人格蕾丝·赫柏(Grace Murray Hopper),她是⼀位为美国海军⼯作的电脑专家,

1947年9⽉9⽇,格蕾丝·赫柏对Harvard Mark II设置好17000个继电器进行编程后,技术⼈员正在进行

整机运⾏时,它突然停⽌了⼯作。于是他们爬上去找原因,发现这台巨大的计算机内部⼀组继电器的

触点之间有⼀只⻜蛾,这显然是由于飞蛾受光和热的吸引,⻜到了触点上,然后被⾼电压击死。所以

在报告中,赫柏⽤胶条贴上飞蛾,并把“bug”来表示“⼀个在电脑程序⾥的错误”,“Bug”这个说

法⼀直沿用到今天。

在计算机领域,"bug" 通常指的是程序或软件中的错误、故障或缺陷。它可以导致程序的意外行为、崩溃、数据丢失或其他不正常的情况。

当程序员在编写代码时,可能会犯一些错误,这些错误可能会导致程序在运行时出现问题。这些问题可能是由于代码逻辑错误、语法错误、算法错误、内存泄漏等引起的。

发现和修复 bug 是软件开发过程中的重要环节。程序员通常使用调试工具和技术来识别和解决 bug。在软件发布之前,通常会进行测试以发现和修复尽可能多的 bug,以确保软件的质量和稳定性。

除了计算机领域,"bug" 这个词也可以用于其他领域,表示类似的错误或缺陷,如生物学中的基因突变或设备中的故障等。

总的来说,"bug" 是指存在于程序、系统或其他事物中的缺陷或错误,需要被修复或纠正。


什么是调试(debug)

当我们发现程序中存在的问题的时候,那下⼀步就是找到问题,并修复问题。

这个找问题的过程叫称为调试,英⽂叫debug(消灭bug)的意思。

调试⼀个程序,⾸先是承认出现了问题,然后通过各种⼿段去定位问题的位置,可能是逐过程的调

试,也可能是隔离和屏蔽代码的⽅式,找到问题所的位置,然后确定错误产⽣的原因,再修复代码,

重新测试。

那么我们再来看看VS里的Debug和Release是什么意思?

Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序;

程序员在写代码的时候,需要经常性的调试代码,就将这⾥设置为 debug ,这样编译产⽣的是

debug 版本的可执⾏程序,其中包含调试信息,是可以直接调试的。

Release 称为发布版本,它往往是进⾏了各种优化,使得程序在代码大小和运⾏速度上都是最优的,

以便用户很好地使⽤。当程序员写完代码,测试再对程序进⾏测试,直到程序的质量符合交付给⽤⼾

使用的标准,这个时候就会设置为 release ,编译产生的就是 release 版本的可执行程序,这个

版本是用户使用的,无需包含调试信息等。

Debug

Release

对比它们两个的内存也是可以发现release比debug版本明显要小。


VS调试快捷键

调试之前我们需要将一个支持调试开发的环境所以我们把VS设置为Debug环境,如图:


现在我们来了解一下VS里常用的快捷键:

F9:创建断点和取消断点

断点的作⽤是可以在程序的任意位置设置断点,打上断点就可以使得程序执⾏到想要的位置暂定执

行,接下来我们就可以使⽤F10,F11这些快捷键,观察代码的执⾏细节。

条件断点:满足这个条件,才触发断点

F5:启动调试,经常⽤来直接跳到下⼀个断点处,⼀般是 和F9配合使⽤。

F10:逐过程,通常⽤来处理⼀个过程,⼀个过程可以是⼀次函数调⽤,或者是⼀条语句。

F11:逐语句,就是每次都执⾏⼀条语句,但是这个快捷键可以使我们的执⾏逻辑进⼊函数内部。在函

数调⽤的地⽅,想进⼊函数观察细节,必须使⽤F11,如果使⽤F10,直接完成函数调⽤。

CTRL + F5:开始执⾏不调试,如果你想让程序直接运⾏起来⽽不调试就可以直接使⽤。


监视和内存观察

监视

开始调试后,在菜单栏中  调试---->窗口---->监视,里面有四个监视窗口,我能随便打开一个便可以了。

 随便选择一个监视窗口后,便可输入你想监视的变量或地址等!如下:

内存

如果觉得仅仅看监视窗口无法解决问题,可以试着看一下内存,也是开始调试后,在菜单栏里     调试---->窗口---->内存,打开内存窗口

打开其中一个窗口你可以在地址那里输入想看的地址,可借助&符号确定变量的地址哦。然后按下那个回旋箭头,然后为了好看我把它显示的列数变为4,大家可以凭感觉来观察内存。如下: 

输入地址按下箭头就会变成如下的内存显示了。 

调试的实例

如:求1!+2!+3!······n!的和。

我们通过简单的测试,输入一个较小的数进行检验发现计算结果并不正确,那说明我们的代码发生错误了,那么我们便要开始进行调试,找出bug。

我们打开监视窗口进行一次循环发现计算1!时并没有发生错误 。如上图:


然后我们计算2!和相加的sum也没有错误。如上图: 


接下来我们看一下3!有没有算错呢?

显而易见代码在计算3!时发生错误,3!=6,但现在 ret 的值为12,通过思考相信我们都能从ret上找出问题,即ret并没有重置,即在计算3!时,ret的值开始计算时便是上次2!的结果,即为2.故这里的ret 计算出12,那我们只需要在计算每个数的阶乘时将ret重置为1,即可,然后继续检验代码知道改出一个完美的代码。 所以各位感受到调试的魅力了吗?


几种代码出错的类型

编译型错误

编译型错误⼀般都是语法错误,这类错误⼀般看错误信息就能找到⼀些蛛丝马迹的,双击错误信息也 能初步的跳转到代码错误的地方或者附近。编译错误,随着语言的熟练掌握,会越来越少,也容易解决。如:

少分号啥的,现在编译器都可以告诉你错误在哪。

链接型错误

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

 如上图,sqort没有定义。

运行时错误

运行时错误,是千变万化的,需要借助调试,逐步定位问题,调试解决的是运行时问题。

这个问题就是上面的实例,ret忘重置为1,等类似问题。


好了本文到此结束。

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

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

相关文章

Java导出Excel并合并单元格

需求:需要在导出excel时合并指定的单元格 ruoyi excel 项目基于若伊框架二次开发,本着能用现成的就不自己写的原则,先是尝试了Excel注解中needMerge属性 /*** 是否需要纵向合并单元格,应对需求:含有list集合单元格)*/public boolean needMer…

11 - PXC集群|MySQL存储引擎

PXC集群|MySQL存储引擎 数据库系列文章PXC集群配置集群测试集群 MySQL存储引擎存储引擎介绍mysql服务体系结构mysql服务的工作过程处理查询访问的工作过程处理存储insert访问的工作过程 什么是搜索引擎 存储引擎管理查看存储引擎修改存储引擎 存储引擎特点myisam存储…

20240119-子数组最小值之和

题目要求 给定一个整数数组 arr,求 min(b) 的总和,其中 b 的范围涵盖 arr 的每个(连续)子数组。由于答案可能很大,因此返回答案模数 Example 1: Input: arr [3,1,2,4] Output: 17 Explanation: Subarrays are [3]…

【排序算法】五、冒泡排序(C/C++)

「前言」文章内容是排序算法之冒泡排序的讲解。(所有文章已经分类好,放心食用) 「归属专栏」排序算法 「主页链接」个人主页 「笔者」枫叶先生(fy) 目录 冒泡排序1.1 原理1.2 代码实现(C/C)1.3 特性总结 冒泡排序 1.1…

基于Springboot的民宿在线预定平台(有报告)。Javaee项目,springboot项目。

演示视频: 基于Springboot的民宿在线预定平台(有报告)。Javaee项目,springboot项目。 项目介绍: 采用M(model)V(view)C(controller)三层体系结构,通过Spring…

SAI实例研究

实现目标 接到特定任务后,召唤生物攻击当前角色 例子 creature.id 15402(即 smart_script.entryorguid)共分为0和1两个事件阶段 第0阶段:第1条(id 0),第2条(id 1),第3条(id 2…

基于YOLOv8的目标识别、计数、电子围栏的项目开发过程

0 前言 用于生产环境中物体检测、识别、跟踪,人、车流量统计,越界安全识别 1 YOLOv8概述 YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型,YOLOv8在之前版本的成功基础上引入了新功能和改进,以提高性…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU,编译费劲,而且我们的应用不需要Yocto的环境,所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核,运行频率可达1 GHz&#x…

PACS医学影像采集传输与存储管理、影像诊断查询与报告管理系统,MPR多平面重建

按照国际标准IHE规范,以高性能服务器、网络及存储设备构成硬件支持平台,以大型关系型数据库作为数据和图像的存储管理工具,以医疗影像的采集、传输、存储和诊断为核心,集影像采集传输与存储管理、影像诊断查询与报告管理、综合信息…

使用JFLASH实现文件程序自动化合并及下载功能

主要总结下使用 SEGGER 工具集的 JFLASH 软件实现hex/bin文件合并以及程序的自动下载使用方法。 起因是最近使用到LVGL字库文件的制作,每次都要将分散的bin文件按既定分配的偏移作合并处理,刚开始使用的是二进制文件合并工具,文件少的时候还行&#xff…

C#使用DateTime.Now静态属性动态获得系统当前日期和时间

目录 一、实例 1.源码 2.生成效果 二、相关知识点 1.Thread类 (1)Thread.Sleep()方法 (2)Thread(ThreadStart) (3)IsBackground (4)Invoke( ) 2.CreateGrap…

【c++函数重载】

文章目录 一. 命名空间二 .全缺省参数和半缺省参数三 . 函数重载 一. 命名空间 1.不指定域:先在局部找,再全局。 2. 指定域:到指定的命名空间去找。 3. 当把指定命名空间放开时,即using namespace std;例如放开标准c库…

分布式 session

分布式 session 种 session 的时候需要注意范围,也就是 cookie.domain。 比如两个域名:a.heo.com,b.heo.com。如果要共享 cookie,可以种一个更高层的公共域名,比如 heo.com。 当服务器 A (localhost:808…

大数据平台的硬件规划、网络调优、架构设计、节点规划

1.大数据平台硬件选型 要对Hadoop大数据平台进行硬件选型,首先需要了解Hadoop的运行架构以及每个角色的功能。在一个典型的Hadoop架构中,通常有5个角色,分别是NameNode、Standby NameNode、ResourceManager、NodeManager、DataNode以及外围机。 其中 NameNode 负责协调集群…

OneNote使用总结

试一下OneNote表格复制到CSDN的编辑器 用表格整理内容挺方便的,不过复制过来格式还是有些变化 目录 常用快捷键 高级应用 常用快捷键 文字编辑与排版 字号增加减小 Ctrl Shift 大于小于号 整行上下移动 左右缩进 Alt Shift方向 插入或转为公式 Alt 等于…

软件需求规格说明书-word

软件需求规格说明书编写规范 1.项目背景 2.项目目标 3.系统架构 4.总体流程 5.名称解释 6.功能模块 软件开发全文档获取:软件项目开发全套文档下载_软件项目文档-CSDN博客

Python笔记10-数据可视化练习折线图

文章目录 JSON数据Python数据和Json数据的相互转化pyecharts模块构建折线图全局配置绘制疫情数据折线图 JSON数据 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 。本质上是一个带有特定格式的字符串 主要功能:可以在各个编程语言中流通…

R语言的ggplot2绘制分组折线图?

R绘制分组折线图.R 首先看数据情况:group有3组。Time有3组,数据意思是在3组3个时间点测量了某指标,现在要绘制组1、组2、组3某指标y按时间的变化趋势 数据情况: 看看最终的效果图如下: 下面是本次使用的代码 .libPat…

合并两个有序数组(三指针法)

这道题使用三指针法,实际上是创建三个变量模拟下标的走势: 一般常规想法是先合并再排序,三指针则是边合并边排序; l1是nums1的有效数据的最后一位的下标,即m - 1; l2是num2的有效数据的最后一位的下标&a…

conda修改默认环境安装位置

conda修改默认环境安装位置 文章目录 conda修改默认环境安装位置查看conda配置信息创建.condarc(conda runtime controlling)配置文件没有.condarc怎么办 即使创建正确放置了.condarc创建环境时还是默认指定C盘目录写权限目录修改权限 查看conda配置信息 conda con…