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

news2024/12/26 16:40:50

在这里插入图片描述

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

在这里插入图片描述

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.coloradmin.cn/o/1892631.html

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

相关文章

阿里云邮件推送邮件发送失败的问题排查解决

阿里云邮件推送为何失败&#xff1f;解决邮件推送失败的步骤指南&#xff01; 即便是功能强大的阿里云邮件推送服务&#xff0c;也可能在实际使用中遇到邮件发送失败的问题。AokSend将详细介绍如何排查和解决阿里云邮件推送邮件发送失败的问题。 阿里云邮件推送&#xff1a;验…

ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程

ode45自己编的程序和测试代码 模型 模拟一个卫星绕大行星飞行的轨迹计算。 结果 轨迹图如下: 源代码 以下代码复制到MATLAB上即可运行,并得到上面的图像: % ode45自己编的程序和测试代码 % Evand©2024 % 2024-7-2/Ver1 clear;clc;close all; rng(0); % 参数设定…

ruoyi mybatis pagehelper 分页优化(自定义limit位置)clickhouse 外部数据源

例如加入clickhouse的分页时发现extends 不生效 则可以添加 startPage();registerDialectAlias("clickhouse", PageMySqlDialectPlus.class);List<MyMonitorlog> list monitorlogService.selectMonitorlogList(monitorlog);主要是需要注册 registerDialectAl…

JAVA 快递100wms工具类

快递wms工具类 import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.gson.Gson; import com.kuaidi100.sdk.api.QueryTrack; import com.kuaidi100.sdk.api.Subscribe; import com.kuaidi100.sdk.contant.ApiInfoConstant; import c…

为什么说牛企查查企业超好用?

步入职场的职场人士&#xff0c;经济相关专业的学生&#xff0c;都有查企业的需求&#xff0c;市面上查企业的软件平台那么多&#xff0c;每个功能都不怎么一样。 有的便宜&#xff0c;但是信息不全。有的信息还可以&#xff0c;但是会员费又很贵&#xff0c;让我这个打工人没…

图像增强方法汇总OpenCV+python实现【第一部分:常用图像增强方法】

图像增强方法汇总OpenCVpython实现【第一部分】 前言常用的图像增强方法1. 旋转&#xff08;Rotation&#xff09;&#xff1a;2. 平移&#xff08;Translation&#xff09;&#xff1a;3. 缩放&#xff08;Scaling&#xff09;&#xff1a;4. 剪切变换&#xff08;Shear Trans…

Java:JDK、JRE和JVM 三者关系

文章目录 一、JDK是什么二、JRE是什么三、JDK、JRE和JVM的关系 一、JDK是什么 JDK&#xff08;Java Development Kit&#xff09;&#xff1a;Java开发工具包 JRE&#xff1a;Java运行时环境开发工具&#xff1a;javac&#xff08;编译工具&#xff09;、java&#xff08;运行…

电机的分类

1.按工作电源种类划分 2.按结构特点分类 3.按启动与运行方式分类 4.按转子结构分类 5.按用途分类 6.按运转速度分类 其他文章介绍了主流电机的原理和使用&#xff1a; 直流电机介绍-CSDN博客 步进电机(STM3228BYJ-48)-CSDN博客 待更新........

使用elasticsearch完成多语言搜索的三种方式

文档目标&#xff1a; 基于elasticsearch&#xff0c;实现不同语言搜索特定语言的文档数据&#xff1b;比如输入中文的内容&#xff0c;搜索中文文档数据&#xff0c;输入英文搜索英文文档数据&#xff0c;日韩文类似 方案概述&#xff1a; 方式一&#xff1a;不同的语言使用不…

Chirp信号生成(FPGA、基于cordic IP核)

一、Chirp生成模块介绍 采用Verilog 生成Chirp&#xff0c;实现输入使能电平&#xff0c;模块输出Chirp信号&#xff0c;Chirp信号频率范围&#xff0c;时间宽度&#xff0c;连续Chirp信号数量可配置。 二、模块例化方法示例 parameter FL d20_000 ; parameter FH…

如何在忘记密码的情况下重置Realme手机?

欢迎阅读我们关于如何在有或没有密码的情况下重置Realme手机的综合指南。无论您是忘记了密码&#xff0c;还是只是需要将设备恢复到出厂设置&#xff0c;我们都会为您提供所需的专业提示和技术专长。 发现分步说明、专家提示和行之有效的方法&#xff0c;轻松重新控制您的 Rea…

如何搭建10万个H100 GPU的集群:电力、并行化、网络拓扑与成本优化

引言 在现代人工智能的发展中&#xff0c;构建大规模GPU集群是提升计算能力的关键手段。今天我们探讨如何搭建一个包含10万个H100 GPU的集群。这个项目不仅涉及巨大的资本支出&#xff0c;还面临电力供应、并行化处理、网络拓扑结构以及可靠性和恢复等多方面的挑战。通过深入分…

zabbix 配置企业微信告警

1、申请一个企业微信&#xff0c; 官网链接 2、群内申请一个机器人 下载电脑版企业微信&#xff0c;登录后&#xff0c;在要接收群消息的群里&#xff0c;点击右上角三个点&#xff0c;添加机器人后&#xff0c;保存机器人的webhook地址 上传应用logo&#xff0c;填写应用名称…

破解电脑卡顿难题,将数据优化,5分钟提升运行速度

当电脑变得缓慢且反应迟钝时&#xff0c;工作效率和娱乐体验都会大打折扣。而电脑卡顿是由于系统资源占用过多、磁盘空间不足等原因引起的。因此&#xff0c;我们经常需要寻找优化措施&#xff0c;提升电脑的运行速度。文章整理了4个优化方法&#xff0c;帮助你破解卡顿难题&am…

5月1日起,《碳排放权交易管理暂行条例》正式施行

2024年5月1日&#xff0c;《碳排放权交易管理暂行条例》&#xff08;以下简称《条例》&#xff09;正式施行&#xff0c;作为我国应对气候变化领域的第一部专门法规&#xff0c;《条例》首次以行政法规的形式明确了碳排放权市场交易制度。 作为碳排放权交易市场的重要补充&…

将KVM虚拟机迁移为Virtualbox虚拟机

1、在KVM宿主机上把qcow2格式磁盘转成vdi格式 [rootkvm ~]# cd /kvm-data [rootkvm kvm-data]# qemu-img convert -f qcow2 wind30.qcow2 -O vdi wind30.vdi 注&#xff1a;把vdi转qcow2命令qemu-img convert -f vdi wind30.vdi -O qcow2 wind30.qcow2 2、把转换成功vdi磁盘…

蓝桥杯开发板STM32G431RBT6高阶HAL库学习FreeRtos——新建工程

一、介绍 ​ 蓝桥杯嵌入式使用的单片机是STM32G431RBT6,内核ARM Cortex - M4,MCU+FPU,170MHz/213DMIPS,高达128KB Flash,32KB SRAM,其余的外设就不多介绍了,参照数据芯片数据手册 ​ CT117E-M4开发板资源:微控制器STM32G431RBT6、一路USB转串口、2.4寸TFT-LCD、4个功…

如何策划交互设计创意?( 计育韬老师高校公益巡讲答疑实录2024)

这是计育韬老师第 8 次开展面向全国高校的新媒体技术公益巡讲活动了。而在每场讲座尾声&#xff0c;互动答疑环节往往反映了高校师生当前最普遍的运营困境&#xff0c;特此计老师在现场即兴答疑之外&#xff0c;会尽量选择有较高价值的提问进行文字答疑梳理。 *本轮巡讲主题除了…

微信小程序一键打造专业简历

在这个竞争激烈的时代&#xff0c;一份出色的简历往往能成为你职业道路上的敲门砖。然而&#xff0c;对于大多数人来说&#xff0c;如何设计一份既美观又专业的简历却是一大难题。为了解决这一痛点&#xff0c;我们团队精心研发了一款微信小程序——“简历君”&#xff0c;它将…

【Qt之·类QVariant·数据类型】

系列文章目录 文章目录 前言一、概述二、操作及用法1.1 存储数据1.2 获取数据1.3 设置数据1.4 数据类型判断1.5 判断数据是否有效 三、实例演示总结 前言 QVariant是Qt开发中非常重要的一部分&#xff0c;它是Qt的一个核心类&#xff0c;用于处理不同数据类型之间的转换和传递。…