Debug

怎样调试程序2 - 各式各样的bug

published on

介绍一下常见bug的分类,这个是我之前从Udacity的Software Debug公开课上看来的,挺有意思。

Bohrbug

指一个稳定的bug,名字取自波尔的原子模型。这些bug行为稳定,你可以通过特定的方法来复现,一般只需简单的将其修正,再用同样的步骤验证其不再出现即可。

Heisenbug

这个名字取自海森堡测不准原理,即观测会对结果产生影响。

就是说一个bug,正常运行的时候会发生,但是当你尝试去调试它的时候,它又正常了。

这种情况其实非常常见,当你调试程序的时候,你可能需要在程序中插入一些log指令来记录下关键的调试信息,或者在一个debugger中运行你的程序,这使得和正常运行的时候产生了不同的结果。

这种bug的常见起因有以下几类:

  • 没有初始化的变量,恩常常在调试器中因为内存布局发生改变就初始化了。
  • 浮点数相关的编译优化,浮点数相关的计算开了编译优化之后往往和编译前不完全等价,在不开编译优化进行调试时可能就没能触发特定的bug。
  • 并发场景,在竞争的情况下,速度慢的程序可能就撞不上bug了。

Mandelbug

这个名字来自于曼德博的分形学,分形的思想常被用于模拟真实世界混沌粗糙的现象。在这里Mandelbug就是描述某种牵涉到方方面面原因的bug,以至于你根本不知道该怎么下手去修复。甚至可能你只能知道这里有个bug,但完全理不清背后的原因。

这种现象在现实中的逻辑复杂的软件中时常可以见到。尤其当你去留意各式各样关于赶时间的游戏开发者调试和修复bug的趣闻的时候,你可以收集到大量这般莫名其妙的bug。

Schrödinbug

这个名字来自著名的薛定谔。这使说系统中有一个bug,但是没人知道。直到有一天一个程序员仔细看了代码…… 恩,你懂的,就是在说那个没人看就即活着又死了的猫。

想看一点例子么,你可以去stackexchange.com上去找到相关的问题,在这免费给他们打个广告。

最后的补充

上面4个是从课上听来的,下面来一个从Yin Wang的blog上看到的:Higgs-Bugson

一种假想中的 bug。它一般是跟据运行日志的少数记录和零星含糊的用户报告推测出来,但是在开发员的机器上很难重现。

这个名字是来自希格斯玻色子(Higgs boson),是一个理论模型中预测出来的粒子,直到2013年才被实验证实。

Read More...

怎样调试程序1 - 序

published on

准备写一个系列,介绍调试程序的一些方法。调试程序是在学校里面最难学到的,非常需要实践训练的一项技能。因为今天时间不多,先写个序,之后慢慢的写。

总体来说,调试的总体思路是:

观察现象 -> 建立假设 -> 设计实验 -> 验证假设

一旦假设通过,分析出出现现象的原因,那么就可以根据原因进行相应的fix了。

当然其中的会涉及到很多的因素(也就是为什么目测可以写一个序列了):

  • 对待调试系统整体的熟悉程度
  • 调试工具,以及对调试工具的熟悉程度
  • 调试的策略
  • 推理的能力

等等,这里只是举了一些基本的例子。实际中,经验也会是极其重要的一部分,所以多写程序,多调试的路线是不可避免的。

参考资料

以前,谈论调试的资料还是比较少的,现在就不一样了,你在douban上搜索调试,可以找到一系列的教程,在公开课程网站udacity上还有专门的软件调试公开课。所以你不一定要看这个序列的教学,也可以考虑去找本书看看,或参加一个公开课程。

总之请等待之后的文章吧。

Read More...