调试是什么意思?(程序员和Bug)
admin
2023-10-21 22:00:29

bug的本义是指昆虫、虫子、损害、缺陷等。在互联网时代,有一个引申的意思,形容某人/某事超乎想象,简直是开放的生活,系统的bug!

一般来说,在码农的世界里,bug是隐藏在计算机系统或程序代码中的一些未被发现的缺陷或问题,可简称为程序缺陷。广义上还包括软件需要改进的细节,或者与需求文档不同的功能实现等等。

bug和程序缺陷有什么关系?

Bug的由来

可以追溯到计算机可以填满整个房间的时代。1945年9月9日,GraceHopper发现了HarvardMarkII计算机的第一个bug。GraceHopper是数据处理方面的专家。1952年,她为UNIVAC开发了第一个编译器,可以将人能理解的高级语言翻译成计算机能识别的机器语言。

那天,GraceHopper对HarvardMarkII设置的17000个继电器进行编程后,技术人员正在运行整机,它突然停止了工作。于是他们爬上去找原因,在这台巨大的电脑里的一组继电器的触点之间发现了一只飞蛾。这显然是因为蛾被光和热吸引,飞到了触点上,被高压电杀死了。死蛾被夹在隐形眼镜中间,因此& quot阻止& quot机器的操作。

所以在报告中,GraceHopper用胶带粘住一只蛾子,并用& quotbug & quot意思是& quot计算机程序中的错误& quot。后来,人们把隐藏在计算机系统或程序代码中的未被发现的缺陷或问题也称为& quot虫子& quot,而与此同时,排除程序故障就叫做DEBUG,已经成为计算机领域的专业术语。

BUG和DEBUG翻译成& quot缺陷& quot和& quot调试& quot用中文。"bug & quot可能更能反映事物的本质,因为& quotbug & quot是从外部爬进来的,而不是程序本身。程序本身的问题是程序本来就有。

程序代码中Bug的产生原因

一般来说,在编程中,Bug是指软件运行过程中,由于程序代码本身的错误而导致的功能异常、体验不佳、数据丢失、异常中断、崩溃等现象。

产生bug的原因有多种,比如:

错误的文件被改成了正确的文件,但是放在了错误的地方,或者只是忘记保存正确的文件而没有重新编译。本来以为条件变量开/关了,实际上运行了错误的版本,问题得到了纠正,但是忘记提交了,问题得到了纠正。然而,其他代码依赖于以前有问题的版本。

软件系统是一个五彩缤纷的世界,总有bug在里面飞来飞去。没有一个软件在发布的时候是绝对没有bug的,因为谁也不能保证自己写的代码没有问题。

bug的生命周期和分类

其实一个bug的生命周期可能是这样的:

产生——被发现——被解决或者成为另一个bug。

但从软件工程,尤其是QA的角度来看,任何bug的一般生命周期都包括以下几个阶段:

新-已分配-已解决-待定检验-已关闭

如果验证时等待验证的bug没有解决,需要重新打开bug,开始循环,继续赋值。

因为bug比较多,在fixbug bugs的时候,我们往往会按照优先级的原则来处理那些影响比较大的bug,需要按照bug的严重程度来分类,比如关键、重大、次要、失效,也就是所谓的P0/P1/P2/P3。当然,粒度也可以分为更细或更粗的。

根据不同的角度,可以对bug进行不同的分类。根据受bug影响的字段分类,可以在《程序员眼中的测试》中找到QA的测试字段。

此外,bug的数量也经常被用作衡量软件质量的指标。CMM中规定的软件质量标准如下(每千行源代码的bug数):

CMM1,11.95CMM2,5.52CMM3,2.39CMM4,0.92CMM5,0.32。所以我们经常在生产调试和调试中徘徊,代码编写时间与调试时间的比值有时高达2,333,608。由于调试是我们工作生活中不可或缺的一部分,所以很容易混淆,虽然调试更多时候是一个过程,但它有时指的是程序调试器。

Debugger是个程序

调试器是工程师或程序员可以用来验证算法的调试软件。在一般的硬件设备中,有专门的调试接口。在不太遥远的DOS世界里,一行调试命令就可以初始化操作系统。

在windows平台上,WinDbg是微软发布的一款优秀的源代码级调试工具,可以用于调试内核态和用户态,也可以调试转储文件。

在Linux平台上,GDB,也称为GNU调试器,通常被用作帮助调试程序的工具。广发银行的主要职能如下:

启动程序,就可以根据自定义要求随意运行程序了。允许被调试的程序在指定的断点处停止。(断点可以是条件表达式)当程序停止时,可以检查此时程序代码中发生了什么。您还可以更改程序代码,纠正一个错误的影响,并测试其他错误。很多跨平台编程语言一般都有自己的调试器。PHP最基本的调试方法是echo或者var_dump。还有一个使用zenddebug或者Xdebug的调试插件。

Pdb是ThePythonDebugger的缩写,

是Python标准库的一个模块。pdb模块规定了一个Python程序交互式源代码调试器,支持在设置断点(包括条件断点),也支持源码级单步调试,支持栈帧监视,支持源代码列出,支持任意栈帧上下文的随机Python代码估值。它还支持事后调试,并且能在程序控制下被调用。

例如:

>>>importpdb>>>importmymodule>>>pdb.run('myfoo.test()')>>>

也可以命令行调用python-mpdbmyfoo.py。

总之,Debugger是我们在单机debug中非常重要的工具。但是,对于分布式系统而言,这些debugger都有着很大的局限,虽然也有一些debugger工具,但多是面向特定系统的。

那么分布式系统的debug主要依赖什么呢?日志。关于日志的重要性,可以参考《全栈必备Log日志》。

Debug的原则

不论是单机上的应用,还是分布式系统,debug是遵循问题隔离的原则,便于定位问题。

问题隔离可能是所有debug中最强大的核心原则.问题是否可重现是非常重要的。如果不能重现这个问题的产生方式,解决起来会变得异常困难。问题隔离使我们拥有了控制变量。

从空间隔离上看,程序代码中具有不同的库或者框架,并且可以包含许多同事的提交,其中,可能有一些已经不再在这个代码库上工作了。问题隔离有助于消除问题的非必要部分,以便专注于一个解决方案.问题隔离的目的是弄清楚是发生冲突的根本原因,了解是否存在竞争条件。

从时间隔离上看,避免一次性的大量修改,越少改动代码越好,这样有助于发现问题。连续反馈的一致性结果越多,bug的跟踪就越容易。所以在调试时,尽量不要安装任何新的软件或组件,或者引入新的依赖。如果发现每次静态输入却返回了不同的错误,应该马上提高警惕,并且全力解决它。

Debug时的一些雕虫小技

通过二分法去定位问题是Debug的一般方法,即便如此,面对各种不同的编程语言,还有千姿百态的软件系统,我们很难有高效快速的通用方法。

但是,有一些debug时的关注点,可以看作雕虫小技。

1.环境检查

复现一个Bug,一般从环境检查开始。从底层到应用层逐层检查,要耐心确认。同时,关注帮助文档、手册或数据表,关注工作目录或者运行环境的路径。

2.日志检查

不要害怕被大量的调试日志,看起来很吓人,但实际上是来帮忙的。大多数时候它会告诉我们真正的问题是什么和在哪里!在25年前,debugC语言程序的时候,自己好像只能依赖printf来定位问题。

根据日志思考:什么导致了这个错误?错误是如何触发的?...

3.代码核查

先看看拼写错误吧,typo或者简单的语法疏忽有时不易发现。有时候括弧或者大括弧的幸运碰撞,有时候context成了content,fetch成了fecth,如果对自己的代码熟视无睹,可以让别人帮着看一眼。

同样,“以终为始”,先检查是否接收了正确的数据类型,一般的防御式编程都可以看到接收的参数或数据。如果接收方合乎预期,跟随调用链的脚步,看调用者的函数,一步一步逼近bug的所在地。

如果定位到了函数,尤其是那些执行的迭代方法(尤其如for、while、do等循环处理),尝试在console上显示一步一步地执行结果。

4.定向验证

对指定的函数或者逻辑输入固定的数据,或者执行固定的代码来做定向验证,可以是正向的,也可以是逆向的。

如果增加了大量输入还看不到所需输出的话,需要确认一下这些代码真的在执行吗?虽然有了条件语句(如if,switch等),但实际上执行的是在这里么?在条件语句中注入简单的代码,比如打印一个简单的“helloworld”,可以帮助您看到程序执行的流程。

当然了,如果有完整一点的单元测试,往往方便的多。

5.注释代码

如果对于bug发生的逻辑模块位置迟迟不能定位,往往还要回归到通过二分法定位。逐行注释代码的方法可能是可行的,但不是最有效的方法。如果对问题所在没有什么想法的话,这可能是一条必经之路。

6.手画流程

“好脑子不让烂笔头”,有时候,我们需要一支笔和一张纸,就可以从所有的技术细节中解放出来,就能从视觉上看到事情是如何运作的,把逻辑流程画出来能够帮助我们梳理和定位代码逻辑上的问题。这有点儿像反向工程,尤其对于那些不熟悉的代码,阅读代码并画出流程会提供较大的帮助。

随笔结语

“ZeroBug”可能是程序员追求的目标,但现实中存在着较大的困难。程序员的日常离不开debug,宽泛一点说是troubleshooting(故障排除)。故障排除在很多时候依赖于经验,反复实践几乎是不二法门,但是,我们可以通过归纳总结自己的经验形成一个“心智模型”,可能是树状的,也可能是金字塔结构,也就是所谓的“套路”。

我们都有一个共同的梦想——成为更棒的程序员,但是如何做?如何学习和精进自己的技术?如何做业务分析和架构设计?如何做技术管理?本书就广大程序员都很关注的问题提供一些思路和方法。

今天我给大家总结出来一份c/c++Linux后台服务器开发架构师成长路线图。需要视频学习的朋友可以后台私信【架构】获取


相关内容

热门资讯

金花创建房间/微信金花房卡怎么... 1.微信渠道:(荣耀联盟)大厅介绍:咨询房/卡添加微信:88355042 2.微信游戏中心:打开微...
金花房间卡/金花房卡如何购买/... 金花房间卡/金花房卡如何购买/新超圣金花房卡正版如何购买新超圣是一款非常受欢迎的游戏,咨询房/卡添加...
牛牛创建房间/金花房卡批发/神... 微信游戏中心:神牛大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...
链接牛牛/牛牛房卡游戏代理/鸿... 鸿运大厅房卡更多详情添加微:33549083、 2、在商城页面中选择房卡选项。 3、根...
科技实测!牛牛房卡怎么获得/乐... 微信游戏中心:乐酷大厅房卡在哪里买打开微信,添加客服【88355042】,进入游戏中心或相关小程序,...