资讯专栏INFORMATION COLUMN

三问助你Debug

jsyzchen / 2361人阅读

摘要:在你对自己提出这三个问题之前,你需要克服自己的惰性,仔细地去分析产生的原因。往往和同事一起会有助于你证实你的假设。尝试将问题用更加抽象的角度去描述将有助于你理解整个程序,以防止引入新的。

译者按: Debug也要三省吾身!

原文: Three Questions About Each Bug You Find

译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

你是否发现:有时候,当某个BUG被我们修复之后,却又发现一个由该BUG引发的另一个BUG,或则由于修复算法的缺陷引入新的BUG?因此,每一次修复BUG,我都会问自己三个问题来确保我考虑周全。你也可以使用同样的方法来提高代码的质量。

这些精心设计的问题的核心思想是:每一个BUG都是某个隐藏的核心问题的表象。你需要解决这些表面症状,但如果只是治标,那么终究会在其它地方复发,没有治本;你需要发现导致这个BUG的核心问题,并且纠正它。导致出现BUG的核心问题一般不会随机而无法控制,只要你理解了它为什么会出现以及什么原因导致它出现。

在你对自己提出这三个问题之前,你需要克服自己的惰性,仔细地去分析产生BUG的原因。通过从出现BUG的代码位置开始,一步一步问自己为什么会错,往回倒着查看程序执行步骤,直到你找到出现这个BUG的模式。往往和同事一起Debug会有助于你证实你的假设。

程序异常是因为下标变量J越界了
为什么呢?
数组的长度为10,下标最大为9,但是下标J已经是10了
为什么呢?
J是整个数组的长度,但是可索引的下标为9。

在寻找BUG原因的过程中,同时检查一下关键变量的值,看看能否解释在此情况下,变量值为何如此。

为什么name是null?
为什么会打印出一条错误信息?

你需要知道程序到底发生了什么,也就是说要将这些信息度都记录下来方便分析。

现在我们来看是看这三个问题。

1. 这个失误在其它地方有犯过么?

看看代码中其它地方有没有使用过类似的编程方法,通过适当的发散思维也有助于寻找类似的BUG。

其它地方有没有使用数组的长度作为下标?

所有的数组都是源自同一个原始数组吗?

如果数组长度为0,是否会出问题?

尝试描述这段代码应当遵循的逻辑,有BUG的代码会违反该逻辑。

数组起点的初始值加上数组的长度并减去1就是最后一个数组元素的下标。如果数组的长度为0,则不满足。

如果每次修改一个BUG的同时修复了几个其它潜在BUG,将大大提高你的工作效率。尝试将问题用更加抽象的角度去描述将有助于你理解整个程序,以防止引入新的BUG。

2. 在这个BUG后面是否可能隐藏着另一个BUG?

当你已经弄清楚如何修复这个BUG,可以预想BUG修复后的程序行为。BUG代码行之后的语句也可能隐藏着BUG,只是程序以前因为BUG崩溃而没有执行到这一步;或则由于修复可能返回其它值,而以前没有考虑。可以试试向自己提如下问题:

接下来的语句可以成功执行吗?

当你在查看程序的控制流的时候,你可以弄清楚有哪些代码还没有执行过。

我是否测试过这些属性的组合

检查各种属性可能性的组合并不会花费太多工作精力,而且往往会发现很多情况开发者都没有考虑到!

我可以测试出所有错误信息吗?

要注意一个地方的改动可能导致其它地方出现BUG。在局部对一个变量的更改也许会违背之前的一些假设。

如果我只是将J减去1,如果数组的长度为0,那么下一行代码会尝试操作数组中位于-1位置的元素。

如果你已经对程序做了很多修改,每一次都要仔细考虑做法是否正确,甚至需要重新设计和实现这部分代码。

3. 我应该如何做来避免类似的BUG?

你需要尝试寻找方法从根源上解决问题。使用新的方法和工具往往可以直接消除该类型的所有BUG,而不是一个一个去发现和解决。

要找到BUG是什么时候引入的,是否可以在开发阶段避免?

设计没有问题;我在写代码的时候引入了BUG

仔细检查BUG发生的原因,理清BUG发生的代码逻辑,然后看看如何纠正。

定义新的不同的类型来区分数组的索引和长度可以在编译时发现这个错误。(索引类型可以限定索引的最大长度)

每一个数组元素输出的时候都输出对应的下标的计算方法,这样我就可以很快找到问题。

假设你对产生某一个BUG的理由是“变量太多,我只是忘记了”,那么你需要做的是如何改进来保证你不需要记住很多变量。

版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/201...

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/85123.html

相关文章

  • 用友云开发者中心助你上云系列之在线调试

    摘要:如何使用开发者中心进行在线调试如果你已经使用了开发者中心部署应用上云,那么,可以非常荣幸的告诉你,看完下面的步骤,只需几秒钟的配置,就可以解救你于水火之中。此过程也可以用于日常开发过程中的在线定位问题,面对众多的微服务,无需再烦恼了。 现在,大家开始越来越多的谈论到高可用架构的互联网应用。什么是高可用?高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素...

    opengps 评论0 收藏0
  • 用友云开发者中心助你上云系列之在线调试

    摘要:如何使用开发者中心进行在线调试如果你已经使用了开发者中心部署应用上云,那么,可以非常荣幸的告诉你,看完下面的步骤,只需几秒钟的配置,就可以解救你于水火之中。此过程也可以用于日常开发过程中的在线定位问题,面对众多的微服务,无需再烦恼了。 现在,大家开始越来越多的谈论到高可用架构的互联网应用。什么是高可用?高可用HA(High Availability)是分布式系统架构设计中必须考虑的因素...

    dunizb 评论0 收藏0
  • 华为云三问广告全新上线—有技术有未来值得信赖

    摘要:全新的华为云品牌广告一组三张,承接了今年月全新品牌口号华为云有技术,有未来,值得信赖,并对其展开进一步延展和深入解读。而华为云始终致力于与客户及合作伙伴风雨同舟,携手共赢未来。华为云,真正关心你的未来。4月27日,华为云全新品牌广告在北京、上海、广州、深圳等16所城市机场同时上线。全新的华为云品牌广告一组三张,承接了今年3月全新品牌口号华为云 有技术,有未来,值得信赖,并对其展开进一步延展和...

    k00baa 评论0 收藏0
  • js中this的“终极三问

    摘要:是什么本质是一个绑定,在函数被调用时建立。它的指向是完全由函数被调用的调用点来决定的。因为函数的调用点在全局作用域,所以指向全局变量这里就是函数的调用点存在的意义在函数体内部指代函数当前的运行环境。从而实现干净的设计和更容易的复用。 this是什么? this 本质是一个绑定, 在函数被调用时建立。它的指向是完全由函数被调用的调用点来决定的。 function baz() { ...

    silvertheo 评论0 收藏0
  • 10个用Console来Debug的高级技巧

    摘要:在本文,我会为你介绍一些用老式来的技巧。使用可以将聚合成组,并且形成嵌套的层级。最后一个压轴的你可以使用将对象以表格的形式打印出来。自从年双十一正式上线,累计处理了亿错误事件,得到了金山软件百姓网等众多知名用户的认可。 译者按: 我们往往会局限在自己熟悉的知识圈,但也应担偶尔拓展一下,使用一些不常见而又有用的技巧,扩大自己的舒适圈。 原文: 10 Tips for Javascrip...

    Hwg 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<