如何有效地解Bug (RED方法)

转载请注明来源:http://blog.csdn.net/horkychen 

解bug应当是修复代码中的缺陷,而不只是隐藏起来!

(译注 :解Bug时常发生分析时总感觉快找到答案了,而后面却一再陷入僵局。比如,将线程同步问题引起的一些时而有,时而没有的问题。分析时可能会认为这是个典型的线程同步问题,A线程没有按照预期的方式改变某个变量,导致了B线程处理出错。这样的分析结果如果没有调试(Debug)的支持,就有可能将开发者带入死胡同,找出一大堆的解决方案可能都无法完整地解掉Bug。一定要在每次陷入困境的时候,回头想一想,还有没有什么被忽略了。在一开始就对问题进行充分的了解是十分必要的。下文中作者提供了一个简单的流程可供参考。)

图片来源:http://www.phptechie.com

原文:http://forums.mtgsalvation.com/blog.php?b=3108

过去两年工作中,我竟然成了一个擅长解Bug的家伙。真不知道为什么偏偏是解Bug成了自然而然的事。在这段时间里我总结出了一套解bug的流程,简称为RED方法吧(译注:感 觉可以像是红色警戒!)。不过,这也不是什么新的方法论了。事实上,它成为标准的软件开发实践已经有些年头了。但是我依然见到许多开发者无法系统运用这个方法,总是被解Bug弄得头大。这就是写这篇文章的原因。

RED方法是什么?它其实上就是三个步骤:
重现(Reproduce),评估(Evaluate),和调试(Debug)
。这三个步骤已经让我能够快速识别Bug的来源并快速的除掉它。c以下是详细的步骤:

 

重现(Reproduce)
重现一个 bug,除了验证它确实存在,也是为了找到一个测试用例供解决时使用。能够自信地测试您的解决方案对确保解掉这个bug 至关重要。(译注:常常有程序员看到Bug描述,就想当然的认为如何如何,结果可与之相反,这样的状况屡见不鲜。重现是第一步,特别是理解Bug背后的意图,就像是软件开发中的需求之于设计一样重要。)

 

评估(Evaluate)
面对Bug, 大多数开发者会将时间花在这里。坦率地说,这是错误的。评估应当用于找出一些显而易见的问题 (错误字符、 错误的常量等),然后调试程序,这样可以快速从代码中隔离出来这个Bug。解bug需要更多地关注代码。评估很重要,但不能靠它来解掉bug。

 

调试(Debug)
这是最重要的一步。一旦确定了Bug出现的位置,就要以单步执行的方式跟踪代码并加以分析。Bug 往往更多地取决于程序的状态,而不是它的位置。如果一个Bug发生是因为某个不应该为NULL的变量却赋成了NULL,那么这个Bug的根本原因可能在此位置之前了。(代码死掉的位置并不一定是Bug存在的位置)。
代码的运行状态比代码本身更重要。运用调试可以让你真正了解程序的运行状态。一行一行地逐步执行程序可以最终发现您的代码在哪里出错了和什么状态导致了这个问题。只有了解了代码为什么出错,而不是只了解代码在什么位置出错,才能找出最佳的解决方案。

例如,刚刚提到的那个Bug可以有两种方案:
  1. 添加判断,以确认该变量不是NULL。
  2. 消除所有可能导致此变量为NULL值的情况。

 

第一种方法有时可能是正确的。但如果在设计时该变量无论在哪里都不应为空,那这样做就有问题了。这样做只会暂时掩饰掉它,而以后可能就要花更多的时间来解决变量为NULL的情况了。

如果先确定导致该变量为NULL的所有情况,对于先前的设计,消除掉这些异常的情况,这样才算真正解掉了这个bug。解bug应当是修复代码中的缺陷,而不只是隐藏起来。

 

(译注:我比较推荐习惯用思维导图的方式来思考,避免思维障碍,并具有普遍怀疑的精神。在软件这个行当,主观经验是经常骗人的! (参考<<软件开发之韵>> 2.3经验式管理)

另一个有价值的参考:
 Avoid Side Effects

)

时间: 2024-10-26 10:52:46

如何有效地解Bug (RED方法)的相关文章

如何有效地解Bug (RED方法)

(译注 :解Bug时常发生分析时总感觉快找到答案了,而后面却一再陷入僵局.比如,将线程同步问题引起的一些时而有,时而没有的问题.分析时可能会认为这是个典型的线程同步问题,A线程没有按照预期的方式改变某个变量,导致了B线程处理出错.这样的分析结果如果没有调试(Debug)的支持,就有可能将开发者带入死胡同,找出一大堆的解决方案可能都无法完整地解掉Bug.一定要在每次陷入困境的时候,回头想一想,还有没有什么被忽略了.在一开始就对问题进行充分的了解是十分必要的.下文中作者提供了一个简单的流程可供参考.

你《提问的智慧+如何有效地报告Bug》了吗?

http://iamin.blogdriver.com/iamin/1204404.html  你<提问的智慧+如何有效地报告Bug>了吗?- -                                          http://www.linuxforum.net/doc/smartq-grand.html 提问的智慧 - How To Ask Questions The Smart Way 译者 D.H.Grand[本站会员] How To Ask Questions The

Android生存指南之:解Bug策略与思路问题的详解_Android

现在维护和定制Android的需求越来越多,做的人也越来越多,而Google直接Release出来的源码中又有很多Bug和不合理的地方,特别是原生的应用,如Mms,Browser, Email, Contacts等.定制或做Android解决方案第一步就是要修复原生的Bug以得到一个稳定的系统.1. 仔细观察Bug的特性了解Bug所涉及的流程和模块有哪些,以及是什么样的Bug,Exception?功能上的?还是UI/UE设计问题.针对不同的问题,可能要采取不同的手段,对于Exception就要先

浏览器BUG处理方法整理

浏览器BUG处理方法整理(部分),供喜欢网页设计的朋友共享: 1. 星号*    IE都能识别*,标准浏览器如FF不能识别*.    例:p { color:yellow; *color:red;}    类似的有    + 加号    只有IE解释    p{color:red; +color:blue}    IE 显示blue  FF显示 red 2.!important    IE6及以下将会忽略该样式,IE7 FF将支持:    p{color:red !important;color

Android生存指南之:解Bug策略与思路问题的详解

现在维护和定制Android的需求越来越多,做的人也越来越多,而Google直接Release出来的源码中又有很多Bug和不合理的地方,特别是原生的应用,如Mms,Browser, Email, Contacts等.定制或做Android解决方案第一步就是要修复原生的Bug以得到一个稳定的系统. 1. 仔细观察Bug的特性 了解Bug所涉及的流程和模块有哪些,以及是什么样的Bug,Exception?功能上的?还是UI/UE设计问题.针对不同的问题,可能要采取不同的手段,对于Exception就

DIV+CSS页面布局中BUG解决方法

DIV+CSS布局中,出现BUG之后,可以考虑从以下几方面检查. 一.检查页面的标签是否闭合 不要小看这条,也许折腾了你两天都没有解决的 CSS BUG 问题,却仅仅源于这里.毕竟页面的模板一般都是由开发来嵌套的,而他们很容易犯此类问题. 快捷提示:可以用 Dreamweaver 打开文件检查,一般没有闭合的标签,会黄色背景高亮. 二.样式排除法 有些复杂的页面也许加载了 N 个外链 CSS 文件,那么逐个删除 CSS 文件,找到 BUG 触发的具体 CSS 文件,缩小锁定的范围. 对于刚才锁定

常用的10种CSS BUG解决方法与技巧

最常用的10种CSS BUG解决方法与技巧-浏览器兼容教程 CSS bug是布局中最头疼的问题.我们需要兼顾各种浏览器,以期待获得一致的效果. 非常遗憾的是各厂商之间的竞争导致很多问题的存在.而IE6与IE7在很多问题上也存在着很大的差别. 轻松的解决CSS bug是我们必须掌握的技能.现在整理出最常用的12种CSS BUG解决方法以及CSS BUG类的小技巧. 希望对您的学习.工作有所帮助,如果您依然有疑问, 一. 针对浏览器的选择器 这些选择器在你需要针对某款浏览器进行css设计时将非常有用

ios8 beta4微信闪退bug解决方法

  ios8 beta4微信闪退怎么办?下文将告诉大家ios8 beta4微信闪退bug解决方法,有果粉表示升级beta4之后会出现微信群名片闪退现象,该如何解决呢?请看下文介绍吧. 法一.使用PP助手修复闪退,步骤请参考:"iphone5s软件闪退怎么办?iphone5s闪退修复工具使用教程". 法二.耐心等待beta5修复bug或微信官方修复.

IOS中Json解析实例方法详解(四种方法)_IOS

作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此"http://www.bejson.com/"网站来进行JSON格式化校验(点击打开链接).此网站不仅可以检测Json代码中的错误,而且可以以视图形式显示json中的数据内容,很是方便. 从IOS5开始,APPLE提供了对json的原生支持(NSJSONSerialization),但是为了兼容以前的iOS版本,可以使用第三方库来解析Json. 本文将介绍Tou