当程序遇上困难:程序调试的艺术(VS)

简介: 当程序遇上困难:程序调试的艺术(VS)

前言

程序调试,是每个程序员在开发过程中都会遇到的必经之路,今天将分享一些实用的调试技巧,来修炼我们内功,拥有好的内功可以让我们的编程更加得心应手哦·。


一、什么是bug?

Bug是指在程序或系统中存在的错误或缺陷。它可能导致程序无法按照预期的方式运行或产生意外的结果。Bug可以是由编程错误、逻辑错误、算法问题、外部环境变化等引起的。当程序员在开发过程中遇到bug时,他们需要通过调试来定位和修复这些问题,以确保程序的正确性和稳定性。

编程常见的错误

常见的错误分类:

编译型错误

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

链接型错误

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

不存在或者拼写错误。

运行时错误

也就是程序运行时逻辑上的错误。此类错误纠正最为麻烦。

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

二、调试是什么?有多重要?

所有发生的事都一定有迹可循,如果问心无愧,就不需要掩盖也就没有迹象了,如果问心有

愧,就必然需要掩盖,那就一定会有迹象,迹象越多就越容易顺藤而上,这就是推理的途径。顺着这条途径逆流而上,就是真相。所以每一个合格的程序员都是一名出色的侦探。

想必许多初学者在日常敲代码的过程中都会遇到程序可以运行但不是自己预期结果的情况,遇到这种情况怎么办呢?大多数人估计都是一行一行的去检查逻辑,然后去猜错误的位置,不容易准确定位到错误位置。那么学会调试,就可以很好的解决这个问题,帮助你更快的锁定错误位置。

调试(英语:Debugging / Debug),又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的基本步骤

1.发现程序错误的存在
2.以隔离、消除等方式对错误进行定位
3.确定错误产生的原因
4.提出纠正错误的解决办法
5.对程序错误予以改正,重新测试

Debug和Release

我们在日常使用编译器时,编译器顶部都会有这样的选项:

它们有什么不同呢?

它们在可执行的文件上也有所不同:

Release版本下执行产生的可执行文件:

Debug版本下:

我们会发现它们两个产生的可执行文件的大小有着不小的差距,Debug版本为调试版本,里边包含了所以的调试信息,而Release版本为发布版本,代码在系统上运行时会做一定的优化,所占内存也会更小。

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

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

此外要特别注意,在Release版本下是无法进行程序调试的。

这里不再对两个版本不同进行详细介绍。

三、windows环境调试介绍

我们要想调试一个程序,必须要是处于Debug的版本下才可以进行调试。

学会使用快捷键进行调试

最常使用的几个快捷键:

F5

启动调试,经常用来直接调到下一个断点处。

F9

创建断点和取消断点 断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在

想要的位置随意停止执行,继而一步步执行下去。

F10

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

F11

逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是

最长用的)。

CTRL + F5

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

调试的时候查看程序当前信息

调试查看临时变量的值

当然我们也可以通过调试来查看当先变量的值,可以先按F10或F11先让程序进入调试的状态下,然后在调试功能的里找到窗口,在窗口的选项里找到监视(只有在调试状态下打开窗口才有),就可以弹出监视栏。

输入想要查看当前变量的名字就可以查看到此时变量的数值。

查看调用堆栈

在窗口里找到调用堆栈选项。

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

 

调试示例练习

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,大家可以通过调试来寻找错误。

示例答案

在程序运行过程中,每次i变化循环都需要将ret初始化为1,上述代码由于未将ret及时初始化为1,导致i=3时,ret的值为2,循环结束后ret的值变为12(2*1*2*3)。1+2+12的值就等于15了。


总结

本期先讲介绍都只是一些简单调试技巧,在后边我们会遇到更复杂的调试情况。使用快捷键可以提高我们的调试效率。

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

在私下里要多多动手,尝试调试,才能有进步哦。好的本期内容到此结束,感谢阅读!

相关文章
|
JavaScript
vue element plus DatePicker 日期选择器
vue element plus DatePicker 日期选择器
911 0
|
9月前
|
弹性计算 负载均衡 网络协议
阿里云SLB深度解析:从流量分发到架构优化的技术实践
本文深入探讨了阿里云负载均衡服务(SLB)的核心技术与应用场景,从流量分配到架构创新全面解析其价值。SLB不仅是简单的流量分发工具,更是支撑高并发、保障系统稳定性的智能中枢。文章涵盖四层与七层负载均衡原理、弹性伸缩引擎、智能DNS解析等核心技术,并结合电商大促、微服务灰度发布等实战场景提供实施指南。同时,针对性能调优与安全防护,分享连接复用优化、DDoS防御及零信任架构集成的实践经验,助力企业构建面向未来的弹性架构。
750 76
|
11月前
|
移动开发 前端开发 API
鸿蒙H5离线包技术分享
鸿蒙H5离线包技术分享:本文基于鸿蒙NEXT Api 12,介绍H5离线包的下载、解压和加载三大核心问题。下载部分支持进度回调与重复下载;解压使用minizip实现并提供进度反馈;加载本地H5页面时处理本地资源与网页跳转,确保无网环境下H5页面正常显示。
358 0
|
传感器 监控 供应链
物联网技术在智慧工地中如何应用?
物联网技术在智慧工地的应用主要包括:实时项目状况监控,通过传感器监测环境条件;人员与设备管理,利用RFID或人脸识别技术记录考勤,实时追踪工人位置;环境与安全监控,确保符合安全标准;施工效率与成本控制,优化资源分配;远程监控与智能分析,支持远程决策;材料管理与供应链优化,减少浪费;智能施工与自动化,提高施工效率。这些应用提升了工地的智能化水平,加强了安全管理,促进了建筑行业的数字化转型。
679 3
|
XML 数据格式 Python
Python模块导入包括:`import math`导入标准库
【6月更文挑战第23天】Python模块导入包括:`import math`导入标准库,`from math import sqrt`导入单个函数,`import numpy as np`给模块取别名,`from random import *`导入所有(不推荐),`import xml.etree.ElementTree as ET`导入子模块,`import_module(&#39;pandas&#39;)`按需导入,和使用相对路径如`from .module import func`处理项目结构。记得调整`sys.path`以包含自定义模块路径。
529 4
|
SQL 关系型数据库 MySQL
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
1292 0
一文速学-玩转MySQL中INTERVAL关键字和INTERVAL()函数用法讲解
|
Python
Python模拟火焰文字效果:炫酷的火焰字动效
Python模拟火焰文字效果:炫酷的火焰字动效
317 1
|
机器学习/深度学习 人工智能 前端开发
「随笔」IT行业哪个方向比较好就业
IT行业就业前景广阔,受PEST因素驱动:政府政策支持如中国“互联网+”、美国“数字化美国”;全球经济复苏及云计算、大数据市场增长;社会数字化转型和人才短缺;科技发展如AI、5G、物联网创造新职位。网络、软件、前端、后端、UI、大数据、AI和物联网是主要就业方向,前端开发需掌握HTML、CSS、JS及新框架,强调团队合作、创新和用户体验。随着技术进步,前端开发将迎来更多机遇和挑战。
406 0
|
网络虚拟化 网络架构
三层交换机对接路由器配置上网实验
三层交换机简介 三层交换机是具有路由功能的交换机,由于路由属于OSI模型中第三层网络层的功能,所以称为三层交换机。 三层交换机既可以工作在二层也可以工作在三层,可以部署在接入层,也可以部署在汇聚层,作为用户的网关。
359 2