二分法冒烟调试——编程调试三板斧

有人说好程序是调出来的,且不说这句话是否片面,不可否认的是调试很重要。

调试的目的是找出问题,二分法冒烟调试是定位大片代码问题最简单粗暴,也是非常有效的方式,因为这种调试方法定位错误代码行的时间复杂度是对数阶。

“二分法冒烟调试”这个名字可能会有点让人迷惑。其实很简单,“二分法”概念取自我们常见的“二分法查找”,这个应该无需解释;而“冒烟”则是取自“冒烟测试”,就是不管三七二十一先运行一下看看正常与否。

“二分法冒烟调试”非常适合用于动态语言,如PHP、Javascript,很多时候因为语言的动态特性导致很难定位问题代码。

举个例子:一个项目是基于第三方的 PHP 系统中做定制开发。该系统定义了自己的模板机制,模板中可以嵌套 PHP 代码。而一个几百行代码的模板文件中的某一行有错,但错误信息只能定位到文件。

这时候二分法冒烟调试就可以登场了:

  • 首先把这个文件拦腰剪走一半代码,刷新浏览器,有错吗?
  • 有,剪走剩下的代码的一半代码,也就是总代码的1/4,刷新浏览器,有错吗?
  • 没错,就说明至少刚删掉的那些代码中有问题。
  • 剪走现有正常的代码把刚才剪掉代码的一半粘回来,刷新浏览器,有错吗?
  • ……
  • 如此反复,基本3~5次就能定位到错误了。

步骤看似麻烦,其实非常省时省力。用这个方法可以先定位错误代码,再分析错误原因。

二分法的思想在调试中还有很多变形用法,今天时间有限就不细谈了,以后如果有时间的话再补充吧。

时间: 2024-11-13 06:49:47

二分法冒烟调试——编程调试三板斧的相关文章

《Linux内核设计与实现》读书笔记 第十八章 调试

第十八章调试 18.1 准备开始          需要准备的东西: l  一个bug:大部分bug通常都不是行为可靠而且定义明确的 l  一个藏匿bug的内核版本:找出bug首先出现的版本 l  相关内核代码的知识和运气 最好能让bug重现,有一些bug存在而且有人没办法让他重现,因为内核与用户程序和硬件间的交互很微妙. 18.2内核中的bug 可以有无数种原因产生,表象也变化多端.代码中的错误往往引发一系列连锁反应,目击者才看到bug. 18.3通过打印来调试 内核提供了打印函数printk

嵌入式系统编程和调试技巧

嵌入式系统的开发,软件的运行稳定可靠是非常重要的.在芯片中,软件是没有质量的,但软件的质量可以决定一颗芯片的成败.芯片设计中,性能能否满足设计要求,除了硬件设计.软硬件配合的设计技巧,对于软件来说,编程的一些技术和技巧同样重要. 本文讲述我在芯片固件开发过程中使用的一些编程调试技巧.针对在嵌入式系统开发中常见的问题,如实时系统下的同步问题,动态内存分配的内存泄漏问题,如何在编程阶段预防BUG出现,调试阶段如何及时发现问题和定位问题.总结下经验,目的是开发一个稳定运行的固件,提高开发效率,提高运行

超完整的Chrome浏览器客户端调试大全

引言 “工欲善其事,必先利其器” 没错,这句话个人觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能干专业的事,这个灵感要来源于之前我想买化妆品时,店里的海报标语,由此联想到,如果你想在某个事情上做好,并且做的专业,那么你一定要把你的工具用好,这样才能事半功倍,我见过很多师兄师姐,写了很多代码,能够很快的完成工作,能够处理很多复杂的业务逻辑,但是对于浏览器的调试掌握的并不全面和深入,说说本人吧,我的编程调试起源于

Cocoa惯性思维调试一例

大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 人总有惯性思维,在编程调试里也不例外.你总以为错误是显然的那一个,可是结果却不是. 在stroyboard中建立2个UIView控制器,如果按下第一个控制其中的reg按钮则会显示第二个控制器视图: - (IBAction)reg:(id)sender { UIStoryboard *sb = [UIStoryboard storyboardWithName:@

Android调试优化篇

为了开发出商业级的应用程序,大规模的測试是不可避免的,同一时候为了提高应用程序的执行速度,须要进行必要的优化.在Android中.提供了丰富的调试与优化工具供开发者应用,主要包含模拟器和目标端等两种场景下使用的工具. 1.Android调试 软件调试是一个伴随软件开发的必定过程.好的调试环境和工具能够提高开发的效率.在Android中,除了提供GDB调试外.还提供了DNSS.Logcat.Dmtracedump.DevTools.Procrank.Dumpsys等开发工具供开发人员使用,当中DM

《Code Complete》ch.23 调试

WHAT? 调试——发现错误的一种手段 WHY? 相对于不善于调试的程序员,善于调试的程序员只需要前者1/20的时间就可以找出问题所在 HOW? 科学的调试方法 把错误的发生稳定下来:假设-证实/证伪 确定错误原因:二分法 同他人讨论问题 忏悔式调试 抛开问题,休息一下 修正问题 动手之前先要理解问题 理解程序本身,而不仅仅是问题 验证对错误的分析 放松一下 治本,而不是治标 修改代码时一定要有正确的理由:不要随机地修改代码,在没有理解代码时对她做的改动越大,你对她能正确工作的信息就越低 检查自

windows调试器尝鲜

曾几何时,我也下载过看雪论坛精华看的津津有味.可惜一直没有动手去调试,学到的x86汇编指令也忘得差不多了.最近将老机器的T4200 CPU换成了更省电,温度更低的P8800,为了支援新的VT虚拟化,特地将Dell 1545的BIOS从A8升级到A14.顺带发现SLIC已经自动升级到2.0了.但是升级以后,win7开始菜单的睡眠功能就无法使用了,于是萌生了降级刷BIOS的想法. 下好了1545A13的BIOS,运行后发现出现了一个warning信息,大意就是不能降级安装,点个确定就退出了.理想情况

计算机科学及编程导论(5)浮点数和二分法

1. Python的数字类型 Python的数字类型分为两类:整型(int)以及浮点型(float). 对于Python来说,整型可以取无限大. Python的整型可以取任意精度 例如,可以输入2**1000次方,仍然会返回正确结果. Python的浮点类型按照IEE754标准,对于64位的计算机而言,表示成如下方式 1位:符号位 11位:指数位 52位:尾数位 这样总共可以表示17位长的精度,如果超过17位,Python就无法处理,比如 0.1**1000次方. 在教学视频中,如果输入 x =

前端chrome浏览器调试总结

引言 "工欲善其事,必先利其器" 恩,这句话我觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能干专业的事,这个灵感要来源于之前我想买化妆品时,店里的海报标语,由此联想到,如果你想在某个事情上做好,并且做的专业,那么你一定要把你的工具用好,这样才能事半功倍,我见过很多师兄师姐,他们写了很多代码,他们能够很快的完成工作,能够处理很多复杂的业务逻辑,但是对于浏览器的调试掌握的并不全面和熟悉,说说我自己吧,我