八 、VS的调试技巧

                                                                                                                                     --- 24.4.20

目录

1、什么是Bug?

2、什么是调试(Debug)?

3、Debug和Release

4、VS基础调试快捷键

4.1、环境准备

4.2、调试快捷键

5、监视和内存观察

5.1、监视窗口

5.2、内存窗口

6、调试举例1

7、调试举例2

8、调试举例3

9、编程常见的错误归类

9.1、编译型错误

9.2、链接型错误

9.3、运行时错误


1、什么是Bug?

一般指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞,也叫Bug。

2、什么是调试(Debug)?

当发现程序中存在问题时,下一步就是找到问题并修复问题,这个找问题的过程称为调试,英文叫Debug,是消灭问题的意思。

调试一个程序,首先是承认出现了问题,然后通过各种手段去定位问题的位置,可能是逐过程的调试,也可能是隔离屏幕代码的方式,找到问题所在的位置,然后确定错误产生的原因,再修复代码,重新测试。

3、Debug和Release

Debug通常称为调试版本:它包含调试信息,并且不做任何优化,便于程序员调试程序;用Debug版本写代码,编译产生的是Debug版本的可执行程序,其中包含调试信息,是可以直接调试的。

Release通常称为发布版本:他往往进行了各种优化,使得程序在代码大小和运行速度上都是最优的。当写完代码使其程序质量符合交付于用户使用的标准,这时就会设置为Release版本,这个是给用户使用的。

Debug由于包含了调试信息,所以内存会更大一些。

4、VS基础调试快捷键

在这里我们将学习程序员是如何调试代码的

4.1、环境准备

首先是环境的准备,需要一个支持调试的开发环境,所以应把编译环境设置为Debug版本。

4.2、调试快捷键

F9:创建断点和取消断点。

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

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

F11:逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部。在函数调用的地方,想进入函数观察细节,必须使用F11,如果使用F10,就会直接完成函数的调用。

CTRL+F5:开始执行不调试,如果想让程序直接运行起来而不调试就可以直接使用。

条件断点:在断点处右击鼠标设置断点的条件。

5、监视和内存观察

5.1、监视窗口

①打开监视窗口(F10开始调试后才能使用监视窗口)

5.2、内存窗口

打开内存窗口

这里列太长了不好观察,可以将列设置为4跟方便观察。

在这里解释一下内存窗口:

与以上相似的窗口还有很多,如:自动窗口(自动帮长序员观察一些值,但是用起来不够方便,所以一般用的比较少)、反汇编(把语句转换成汇编代码)、寄存器(暂存数据)。

6、调试举例1

求:1!+ 2!+ ... +10!

在这里我们先用3试一下值是否正确

这里的结果本应该是9,但是实际编译器出现的是15,实际的结果和预期是不相等的,这就是Bug。

下面我们借助调试解决问题:

经过调试后发现每次进行第二个for循环中ret的值都会保留上一次的值进行运算,所以在进行第二个for循环之前应该加上一个ret = 1;才能解决这个问题。

解决完问题后我们来想一下:

每次

这样会很占用空间,而且过程也很麻烦。

我们下面来进行程序的优化:

7、调试举例2

在VS2022、X86、Debug环境下:

这里我们发现程序进入了死循环在这里我要解释一下:

①i和arr是局部变量,局部变量放在内存的栈区

②战区上的内存的使用习惯是:先使用高地址的空间,在使用低地址的空间

这里我们可以画一幅图更好的展示一下:

i 和 arr 中间空多大空间,完全是取决于编译器的实现,在VS中刚好这里 i 和 arr 中间空了两个整型,所以当 arr[12] 的值会替换 i 的值,从而开始死循环。

不同的编译器中间的空隙不同,如果在VC6.0中这个代码 arr 和 i 之间没有空隙;如果在gcc中这个代码 arr 和 i 之间空一个整型。

8、调试举例3

注意在监视时,观察自定义函数中的值时,想观察一维数组前10个元素应该在监视窗口中输入arr3,10;如果想观察二维数组,则应输入arr4,3。

9、编程常见的错误归类

编程常见错误分为三种:编译型错误、链接型错误、运行时错误。

9.1、编译型错误

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

9.2、链接型错误

编译器报错时会出现“无法解析的外部符号”如下:

这里是由于未包含头文件<stdio.h>

也一样是链接型错误,这里报错是因为函数Add未定义。

9.3、运行时错误

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

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

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

相关文章

旅行者1号有什么秘密?飞行240多亿公里,为什么没发生碰撞?

旅行者1号有什么秘密&#xff1f;飞行240多亿公里&#xff0c;为什么没发生碰撞&#xff1f; 自古以来&#xff0c;人类就对浩瀚无垠的宇宙充满了好奇与向往。从最初的仰望星空&#xff0c;到如今的深空探测&#xff0c;人类探测宇宙的历史发展可谓是一部波澜壮阔的史诗。 在…

缺陷 规避

1. NPE 空指针异常(Null Pointer Exception) 1)使用注解 NotNull 和 Nullable 2)用 Optional 处理链式调用 3)用 Objects.equals(a,b) 代替 a.equals(b)&#xff0c;能够避免任意对象为 null 时的 NPE。 4)使用空对象模式,空对像模式通过一个特殊对象代替不存在的情况&…

如何模拟一个元素(如一个链接 <a>)被禁用(disabled)的状态

就像表单元素&#xff08;如 <input>、<button> 等&#xff09;的 disabled 属性一样。 要模拟一个元素被禁用的状态&#xff0c;你可以使用CSS来移除或改变该元素的交互性&#xff0c;并为其添加视觉上的提示。以下是一些建议的方法&#xff1a; 移除交互性&…

双指针练习:有效三角形的个数

题目链接&#xff1a;611.有效三角形的个数 题目描述&#xff1a; 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 解法一&#xff08;暴力求解&#xff09;&#xff08;会超时&#xff09;&#xff1a; 算法思路&#xff1a; 三层…

Chromium源码阅读:从页面加载到元素展示(1)

​ 从&#xff1c;p&#xff1e;hello world&#xff1c;/p&#xff1e;.html到界面上的hello world 今天&#xff0c;我们一起来看看一个html元素&#xff0c;是如何绘制到界面上。我们选择了最简单的场景&#xff0c;便于快速掌握总体的流程&#xff0c;加深之前阅读知识的…

yolo模型评估指标相关概念

mAP&#xff08;mean Average Precision 平均精度&#xff09;&#xff0c;是一个经常被用来衡量目标 检测模型是否具有较好性能的指标。 计算mAP需要先计算每一类物体的AP&#xff0c;然后取平均值&#xff0c;所以下面介绍的 TP,FP,FN,TN都是针对某一类物体&#xff08;目标&…

Java课程设计:基于Javaweb的超市商品管理系统

文章目录 一、项目介绍二、项目展示三、源码展示四、源码获取 一、项目介绍 管理员用户&#xff1a;需要能够添加商品类型以及商品&#xff0c;能够对商品进行管理&#xff0c;能够查询用户信息&#xff0c;能够查询出售记录&#xff1b;普通用户&#xff1a;需要能够搜索商品…

搜维尔科技:【应用】人形机器人将成为引领产业新浪潮的尖兵

特斯拉纷纷发表人形机器人计划&#xff0c;预示这项先进科技将成为下一个颠覆性的殖民地。人形机器人被视为继电脑、智能手机和电车之后,又一个将改变世界的创新产品。 全球人口结构正在快速老化&#xff0c;至2050年60岁以上人口将达22%,是现今的两倍。劳动人口短缺迫在眉睫&…

NewspaceAi之GPT使用新体验

GPT功能 使用地址&#xff1a;https://newspace.ai0.cn/ 上车 挂挡 踩油门&#xff0c;一脚到底&#xff0c;开始你的表演 问题1&#xff1a;你能做什么详细告诉我&#xff1f; 下面内容是GPT的回答 当然&#xff01;作为一个基于GPT-4架构的AI&#xff0c;我能够在许多方面为…

cocomap计算原理

### 计算 mAP 的过程 1. **初始化和准备工作&#xff1a;** - 加载并初始化评估参数和结果&#xff0c;包括类别、IoU 阈值、召回率阈值、面积范围和最大检测数等。 - 初始化用于存储精度、召回率、得分和 F1 分数的数组。 2. **遍历每个类别、面积范围和最大检测数量&…

关于FPGA对 DDR4 (MT40A256M16)的读写控制 2

关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 2 语言 &#xff1a;Verilg HDL EDA工具&#xff1a;ISE、Vivado、Quartus II 关于FPGA对 DDR4 &#xff08;MT40A256M16&#xff09;的读写控制 2一、引言二、DDR4的简介四、DDR4 SDRAM状态框图 关键词&#x…

mysql5.7安装后未要求输入密码就能使用mysql登录原因

ubuntu20安装mysql5.7后&#xff0c;在root用户下直接运行mysql就能进入数据库。在其它用户下却无法登录&#xff0c;提示以下错误&#xff1a; Access denied for user ‘root’localhost’ 原因是root用户默认使用socket认证&#xff1a; mysql> select user,plugin fro…

Java 泛型与集合的深入解析:原理、应用与实践

泛型的基本原理 为什么需要泛型 在Java 5之前&#xff0c;Java的集合类只能存储Object类型的对象。这意味着&#xff0c;存储在集合中的对象在取出时需要进行类型转换&#xff0c;这不仅繁琐&#xff0c;而且容易出错。泛型通过在编译时进行类型检查&#xff0c;确保类型安全…

使用canvas制作一个无人机旋转特效

​ 使用HTML5的Canvas API来制作一个无人机旋转特效。这个特效将包括一个无人机图标&#xff08;你可以使用任何你喜欢的图标&#xff09;&#xff0c;它会在一个固定的位置旋转。 首先&#xff0c;我们需要创建一个HTML文件&#xff0c;然后在其中添加一个canvas元素。canvas…

用Unity创造自己的绿洲

“谢谢你能玩我的游戏&#xff01;” 希望将来我也能做出一款影响全世界的游戏&#xff0c;就比如现在的《英雄联盟》&#xff0c;或是电影里的《绿洲》&#xff01;然后也说出这么一句话&#xff1a;谢谢你能玩我的游戏&#xff01; 阶段性的总结一下 那就展示一下最近完成的…

【Hachker News】如果你不需要钱,你会干什么?

Hachker News上的一个问题&#xff0c;标题是“如果你不需要钱&#xff0c;你会做什么&#xff1f;” 回答摘要 问题链接&#xff1a;What would you spend your time working on if you didn’t need money? A1&#xff1a; 我会把时间投入到城市周围的农村地区&#xff0c…

Matlab使用Simulink仿真实现AM和BPSK信号的解调

前言 本篇实现了基于AM和BPSK调制的通信系统&#xff0c;采用Bernoulli Binary Generator生成随机二元序列&#xff0c;码元速率为0.5秒/个。AM调制使用Sine Wave模块生成载波&#xff0c;频率40Hz&#xff0c;相位π/2。BPSK调制通过Switch模块切换相位0和π的载波。信号传输…

【java计算机专业毕设】房屋租赁系统代码源码MySQL springboot vue html maven送文档ppt

1项目功能 【java计算机专业毕设】房屋租赁系统javaweb MySQL springboot vue html maven 送报告 2项目介绍 系统功能&#xff1a; 房屋租赁系统包括管理员和用户和房东三种角色。 该系统包含多个功能模块&#xff0c;分别为管理员、用户和房东提供服务。管理员功能包括个人中…

近期docker镜像加速器被封杀,需要的请看此内容 点赞加关注

{ “registry-mirrors”: [“https://docker.m.daocloud.io”], “insecure-registries”: [“harbor.sunya.com”], “exec-opts”: [“native.cgroupdriversystemd”], “data-root”: “/data/docker”, “log-driver”: “json-file”, “log-opts”: {“max-size”:“500m…

20.2 JSON-JSON解码、映射数据类型、处理JSON响应

1. JSON解码 JSON解码&#xff0c;即将JSON格式在字符串转换为Go语言数据类型的变量。 函数Unmarshal接受一个JSON字节切片和一个指定目标格式的接口。而这个借口即与JSON字符串中的结果相匹配的结构体类型的变量。 定义结构体类型 type Person struct { ... }创建结构体变量…