掌握高效实用的VS调试技巧

在这里插入图片描述

🔥 个人主页:大耳朵土土垚

在这里插入图片描述

1.编程常见的错误

1.1编译型错误

编程编译型错误是指在编译代码时发现的错误。编译器在编译过程中会检查代码是否符合语法规范和语义要求,如果发现错误会产生编译错误。

直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定。相对来说简单。

如下图所示:

在这里插入图片描述

以下是一些常见的编译型错误:

  1. 语法错误:代码不符合编程语言的语法规范,常见的语法错误包括拼写错误、缺少分号、括号不匹配等。

  2. 类型错误:变量或表达式的数据类型不匹配,例如将字符串赋值给整数变量。

  3. 未声明的标识符:使用了未声明的变量、函数或类名。

  4. 重复定义:重复声明、定义了同名的变量、函数或类。

  5. 缺少头文件或引用错误:在C/C++程序中,使用了未包含的头文件或引用了未定义的标识符。

  6. 语义错误:代码逻辑不合理或不符合语义要求,例如使用了未初始化的变量、使用了无效的循环条件等。

  7. 数组越界:访问数组时超出了数组的有效范围。

  8. 语义冲突:代码存在歧义或语义冲突,例如函数返回类型与函数定义不一致、重载函数无法区分等。

  9. 缺少库文件或链接错误:在链接阶段找不到需要的库文件或链接时出现错误。

  10. 操作符错误:使用了错误的操作符或操作符的操作数类型不匹配。

编译型错误需要在编译前进行修复,通常会在编译器输出错误信息,指示出错的代码行数和具体错误信息,以帮助开发人员进行修复。

1.2链接型错误

编程链接型错误是指在将多个源文件链接成可执行文件时出现的错误。链接器负责将不同源文件中的代码和数据合并在一起,并解决函数和变量的引用关系。

看错误提示信息,主要在代码中找到错误信息中的标识符,然后定位问题所在。一般是标识符名不存在或者拼写错误。

如下图所示:
在这里插入图片描述

以下是一些常见的链接型错误:

  1. 未定义的符号:代码中引用了其他源文件中定义的函数或变量,但链接器找不到其定义。

  2. 多重定义:多个源文件中定义了同名的函数或变量,链接器无法决定使用哪一个定义。

  3. 符号重定位错误:链接器无法正确将不同源文件中的代码和数据关联起来。

  4. 重复符号:同一个源文件中定义了多次同名的函数或变量。

  5. 引用符号解析错误:链接器无法正确解析函数或变量的引用关系。

  6. 缺少库文件:链接器无法找到需要的库文件或库文件不完整。

  7. 内存溢出:链接后的可执行文件大小超过了系统可用的内存空间。

  8. 地址冲突:多个源文件中定义了具有相同地址的变量。

1.3运行时错误

编程运行时错误是指在程序执行过程中出现的错误,也称为异常。这些错误会导致程序的意外行为或崩溃。

借助调试,逐步定位问题,最难搞。

如下图所示:
在这里插入图片描述

这里我们使用函数递归来遍历二叉树时,将递归结束条件屏蔽后,就会出现栈溢出导致程序运行错误

以下是一些常见的运行时错误:

  1. 空指针异常:当程序试图访问一个空指针时引发的错误。

  2. 数组越界异常:当程序试图访问数组中超出有效索引范围的元素时引发的错误。

  3. 除以零异常:当程序试图执行除以零的操作时引发的错误。

  4. 类型转换异常:当程序试图将一个不兼容的数据类型转换为另一种类型时引发的错误。

  5. 文件操作异常:当程序试图打开、读取或写入文件时发生了错误。

  6. 内存分配异常:当程序试图分配或释放内存时出现错误。

  7. 栈溢出:当程序递归调用层级过深或使用过多局部变量时导致程序栈溢出。

  8. 死锁:在多线程编程中,当两个或多个线程相互等待对方释放锁导致程序无法继续执行时发生的错误。

  9. 无限循环:当程序进入一个无法退出的循环时导致程序永远执行下去。

  10. 逻辑错误:程序逻辑的错误,导致程序得到错误的结果。

运行时错误通常会导致程序崩溃或产生不可预测的结果。为了解决运行时错误,可以使用调试工具来跟踪错误发生的位置,并检查代码逻辑以发现错误。此外,异常处理机制可以用于捕获和处理运行时错误,使程序在出现错误时能够进行适当的处理,避免程序崩溃。

2.调试

2.1什么是调试

  • 调试(Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。
  • 调试的基本步骤
    ✨发现程序错误的存在
    ✨以隔离、消除等方式对错误进行定位
    ✨确定错误产生的原因
    ✨提出纠正错误的解决办法
    ✨对程序错误予以改正,重新测试

2.2Debug和Release的介绍

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

我们写代码通常使用debug版本:

在这里插入图片描述

Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

3.Windows环境调试介绍

首先在环境中选择 debug 选项,才能使代码正常调试。
如下图所示:

在这里插入图片描述

3.1使用快捷键

在这里插入图片描述

最常使用的几个快捷键:

  • F5
    启动调试,经常用来直接跳到下一个断点处。
  • F9
    创建断点和取消断点
    断点的重要作用,可以在程序的任意位置设置断点。
    这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。

例如,当我们发现使用二叉树前序遍历时程序会异常,经过思考我们发现可能是前序遍历函数出现的问题,就可以在使用前序遍历函数的那一行按下F9创建断点,然后按下F5启动调试,程序直接跳到前序遍历函数这里:

在这里插入图片描述

使用F5开始调试:

在这里插入图片描述

  • F10
    逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句。
  • F11
    逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最长用的)。
    在这里插入图片描述

开始调试后,进入前序遍历函数内部,进行逐语句调试

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

  • 停止调试就可以点击如下图所示的红色图标

在这里插入图片描述

  • 想知道更多快捷键?点我

3.2调试的时候可以查看的程序信息

3.2.1查看临时变量的值

在调试开始之后,用于观察变量的值。

步骤如下图所示:

在这里插入图片描述

使用断点,开始调试到断点位置后,就可以使用F11逐语句调试,然后就可以利用监视查看当前临时变量的值了,如下图所示:

在这里插入图片描述

这里我们发现数组还没有初始化,这是因为第79行还没有执行,当我们按下F11进行下一句的时候,数组就会初始化完毕了:

在这里插入图片描述

3.2.2查看内存信息

在调试开始之后,用于观察内存信息。

步骤如下图所示:
在这里插入图片描述

使用断点,开始调试到断点位置后,就可以使用F11逐语句调试,然后就可以利用内存观察内存信息了,如下图所示:

在这里插入图片描述

如果想显示的更清楚一些,可以将显示的列改成4列,让它一行显示4个字节:

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

对于我们想查看的内存信息,可以在上方地址栏输入我们已知的地址进行查看:

在这里插入图片描述

我们知道数组名就是数组首元素地址,所以我们在地址栏直接输入数组名,回车即可:

在这里插入图片描述

这样我们就可以看到每个地址对应的值了,注意这里是十六进制显示

3.2.3查看调用堆栈

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置

步骤如下图所示:

在这里插入图片描述

结果如下:

在这里插入图片描述

3.2.4查看汇编信息

可以切换到汇编代码,查看反汇编可以帮助我们更好地理解程序的执行过程和内部运行机制

步骤如下图所示:

在这里插入图片描述
还有一种比较直接的方法:

当调试开始后,鼠标单击右键,选择转到反汇编

在这里插入图片描述

结果如下:

在这里插入图片描述

3.2.5查看寄存器信息

可以查看当前运行环境的寄存器的使用信息。在调试过程中,查看寄存器信息可以帮助我们了解程序运行的状态和指令的执行过程。

步骤如下图所示:
在这里插入图片描述

结果如下:

在这里插入图片描述

4.多多动手,尝试调试

一定要熟练掌握调试技巧。

初学者可能80%的时间在写代码,20%的时间在调试。但是一个程序员可能20%的时间在写程序,但是80%的时间在调试。

多多使用快捷键,提升效率

✨实例

求 1!+2!+3! …+ n! ;不考虑溢出。

//sum = 1! + 2! + 3! +...
int main()
{int i = 0;int sum = 0;//保存最终结果int n = 0;int ret = 1;//保存n的阶乘scanf("%d", &n);for(i=1; i<=n; i++){int j = 0;for(j=1; j<=i; j++){ret *= j;}sum += ret;}printf("%d\n", sum);return 0;
}

这时候我们如果3,期待输出9,但实际输出的是15。
如下图所示:

在这里插入图片描述

我们发现结果与我们预期实现的结果不一样,这表明我们的代码可能有点问题,如果直接观察或读代码无法找出错误原因,我们就可以通过调试来寻找错因:

  • 首先我们知道整个实现逻辑的重点在for循环那里,错误很可能在那里出现,所以我们就在for循环那里按F9打下断点
    在这里插入图片描述
  • 然后F5开始调试
    在这里插入图片描述
  • 在控制台输入3后,使用F11逐行调试,并搭配监视窗口观察变量值
    在这里插入图片描述
  • 发现问题

在这里插入图片描述

我们发现当循环到i = 3时,在计算3!时ret应该等于3*2 = 6,而这里ret = 12,再仔细观察发现:
在这里插入图片描述
当开始计算3!时,ret是从2开始乘积的,所以造成了3!=12,故每次计算完阶乘我们都应该将ret置为1

  • 正确代码
    在这里插入图片描述

5.结语

在写代码时,我们不可避免会出现一些错误,以下是一些提高代码正确率的小tips:

  1. 使用assert
  2. 尽量使用const
  3. 养成良好的编码风格
  4. 添加必要的注释
  5. 避免编码的陷阱

以上就是今天所有的内容啦~ 大家要注意多多练习,完结撒花~ 🥳🎉🎉

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

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

相关文章

数据库安全审计系统:满足数据安全治理合规要求

伴随着数据库信息价值以及可访问性提升&#xff0c;使得数据库面对来自内部和外部的安全风险大大增加&#xff0c;如违规越权操作、恶意入侵导致机密信息窃取泄漏&#xff0c;但事后却无法有效追溯和审计。 国内专注于保密与非密领域的分级保护、等级保护、业务连续性安全和大数…

SpringBoot实战(二十八)集成 Collabora Online 实现在线编辑

目录 一、什么是 Collabora Online?二、Docker 下载并启动 CODE2.1 拉取镜像2.2 启动镜像2.3 访问界面2.4 补充:nextcloud 的镜像启动三、SpringBoot 实现 WOPI 服务3.1 什么是WOPI?3.2 Spring Boot 简单实现3.3 另一种实现方式3.4 总结四、补充:coolwsd.xml 核心配置介绍c…

LeetCode 1327, 383, 236

目录 1327. 列出指定时间段内所有的下单产品题目链接表要求知识点思路代码 383. 赎金信题目链接标签思路代码 236. 二叉树的最近公共祖先题目链接标签思路代码 1327. 列出指定时间段内所有的下单产品 题目链接 1327. 列出指定时间段内所有的下单产品 表 表Products的字段为…

matlab 干涉图仿真

目录 一、算法概述1、干涉图2、生成步骤 二、代码实现三、结果展示 本文由CSDN点云侠原创&#xff0c;原文链接。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、算法概述 1、干涉图 干涉图是两束或多束相干光波相遇时&#xff0c;它们的振…

【软件测试】Selenium自动化测试框架 | 相关介绍 | Selenium + Java环境搭建 | 常用API的使用

文章目录 自动化测试一、selenium1.相关介绍1.Selenium IDE2.Webdriverwebdriver的工作原理&#xff1a; 3.selenium Grid 2.Selenium Java环境搭建3.常用API的使用1.定位元素2.操作测试对象3.添加等待4.打印信息5.浏览器的操作6.键盘事件7.鼠标事件8.定位一组元素9.多层框架定…

[笔记] 卷积03 - 运算的对称性 时域构建高通滤波器的失败尝试

1.卷积运算具备足够好的对称性 1.在计算卷积时&#xff0c;两个函数的位置是可以颠倒的&#xff0c;对吧&#xff1f; 在卷积运算中&#xff0c;确实可以对参与卷积的两个函数进行颠倒。这是因为卷积的定义是通过一个函数与另一个函数的翻转后的形式进行积分运算。具体来说&a…

DPDK概述

文章目录 1. DPDK概述1.1 DPDK 内存管理Mbuf单帧结构:1.2 DPDK内核驱动 igb_uio驱动1.3 DPDK源码下载方式1.4 pktgen源码下载方式1.5 DPDK相关名词解释 1. DPDK概述 Intel DPDK全称Intel Data Plane Development Kit&#xff0c;是Intel提供的数据平面开发工具集&#xff0c;为…

第十三章 Nest Middleware

在上一章我们了解到Nest 并不直接依赖Express 可以切换到别的http 请求处理库 创建项目&#xff1a; nest new middleware-test -p npm创建 middleware &#xff1a; nest g middleware test --no-spec --flat这时候可以看到 req 和 res 的类型都是为 any类型 所以并不知道使…

算法力扣刷题记录 二十八【225. 用队列实现栈】

前言 栈和队列篇。 记录 二十八【225. 用队列实现栈】 一、题目阅读 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void p…

实验四 SQL的数据定义语句

题目 通过SQL语句创建名为ecommerce1的数据库&#xff1a;CREATE DATABASE ecommerce1 2、在数据库ecommerce1中练习模式的创建和删除语句&#xff08;如给用户li创建一个学生管理模式“S-T”&#xff09;&#xff08;需要先添加一个用户li&#xff09; 3、在数据库ecommerce1中…

7月4号直播预告 | 全国产EtherCAT运动控制器ZMC432HG及其EtherCAT总线使用

EtherCAT运动控制边缘控制器是工业互联网的关键组件之一&#xff0c;结合丰富的运动控制功能、实时数据采集、处理和本地计算等&#xff0c;具备高度灵活的可编程性和出色的运动控制性能&#xff0c;为运动控制协同工业互联网应用带来巨大市场潜力&#xff0c;同时也使其成为企…

ID3算法决策树

步骤&#xff1a; 先计算出信息量&#xff1b;信息熵&#xff1b;信息增量&#xff1b; 再比较信息增量的大小&#xff0c;确定分类依据。 信息量&#xff1a; 信息熵&#xff1a; 信息增益&#xff1a;

Postman使用教程

传统接口风格 RESTful风格 使用Postman完成测试用例目标&#xff1a; Postman教程 &#xff08;1&#xff09;准备工作&#xff0c;下载Postman新建 &#xff08;2&#xff09;登录接口调试-获取验证码 &#xff08;3&#xff09;登录接口调试-登录 &#xff08;4&#xff09;…

Mysql查询IFNULL和想象的不一样

select sum(ifnull(a,0)) aaa,ifnull(sum(a),0) bbb from (select g.goodsid a from goods g where g.goodsid 601 ) tmp #注意 goodsid 601 的不存在 ​​​ 返回的结果和想象中不同&#xff0c;解释如下 在您SQL查询中&#xff0c;创建了一个子查询&#xff08;别名为tmp&a…

Linux_管道通信

目录 一、匿名管道 1、介绍进程间通信 2、理解管道 3、管道通信 4、用户角度看匿名管道 5、内核角度看匿名管道 6、代码实现匿名管道 6.1 创建子进程 6.2 实现通信 7、匿名管道阻塞情况 8、匿名管道的读写原子性 二、命名管道 1、命名管道 1.1 命名管道通信 …

国内外大模型集合

为了满足日益增长的AI需求&#xff0c;我们精心打造了一站式大模型导航网站&#xff0c;旨在成为连接您与全球顶尖人工智能模型的桥梁。无论您是科研工作者、开发者还是对AI充满好奇的探索者&#xff0c;这里都有您所需。 国内大模型精选 通义千问 —— 阿里巴巴集团倾力打造…

某业帮六月校招后端笔试

题目一 解题思路 签到题&#xff0c;dp就行。 题目二 解题思路 这个比较烦人&#xff0c;需要处理额外的引号和括号。用DFS&#xff0c;对于每个间隙&#xff0c;插入与不插入都搜一遍。 题目三 解题思路&#xff1a; 双指针&#xff0c;左右各一个指针&#xff0c;对比长度&…

OpenLCA、GREET、R语言的生命周期评价方法、模型构建

原文链接&#xff1a;OpenLCA、GREET、R语言的生命周期评价方法、模型构建教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247608240&idx6&sn1b5758206d500399fe7cc69e800f61fe&chksmfa826657cdf5ef413d31557941a1c5db5cc84bba8d0f408c469e05a4118c…

#LinuxC高级 笔记一

linux命令 什么是嵌入式&#xff1f; 以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统 计算机系统组成&#xff1f; 硬件、软件 操作系统&#xff1f; ios windows harmo…

k8s_集群搭建_k8s管理前端_dashboard安装部署---分布式云原生部署架构搭建017

然后再去安装一下一个dashboard,有了这个以后,操作k8s集群就不用 一直敲命令了 可以看到上面的命令拿过来,然后 执行就可以了 然后如果执行慢,可以直接先去下载,使用wget,然后再去 也可以在浏览器访问,把内容拿到,然后 下面是内容: # Copyright 2017 The Kubernetes Author…