阿哈,调试!

看了jon bentley的《programming pearls》真是见识不少,特别在实践中对于调试的感受,直想把它与大家分享。

正文:
  调试
  每个程序员都知道,调试是一件困难的事情。但是熟练的调试共员可以使这项工程每起来很简单。一些程序员心烦意乱地描述他们已经花了几个小时找bug,而主管人员问了几个问题,结果数分钟之后,程序员在瞪着眼睛看着那段代码了。专业调试人员决不会忘记, 不管系统行为初看起来有多么神秘,里头必定存在一定的逻辑解释。
  在IBM的约克城研究中心中就有一段逸史说明了那种态度。一位程序员最近安装了一个新的工作站。当他坐下来时一切都正常,但是当他站起来时他就不能登录系统了。那种行为有百分之百的可重复性:坐下时可以登录而站起来时从来都不能登录。
  我们当中的大多数人都只是把头靠在椅背上,对这样的情况百思不得其解。那个工作站怎么知道那个可怜的家伙是站着呢还是坐着呢?但是优秀的调试员知道里头必定大有文章。最容易怀疑到的就是电气理论了。地毯下的电线松了吗?存在静电问题吗?但也不一家就是电气方面的问题。一个机灵的同事最后问对了一个问题:程序员站着和坐着时分别是如何登录的?伸出手再试试。
  问题就在键盘上:两个键帽松动了。程序员坐下时因为他是触摸打字,所以没有注意到这个问题;但是当他站起来的时候,是在和敲击键盘。他就要犯错误了。了解了这一点,专业调试员拿了把改锥,拧紧了那两个晃晃悠悠的键帽,之后一切都正常了。
  芝加哥的一个银行系统已经正常动作了好几个月,但是想不到的是,第一次处理国际数据就停止工作了。程序员花了几天的时间追朔代码,但他们不能找到任何停止该程序的命令。当更仔细地观察这个问题时,他们发现当他们输入有厄瓜多尔的某些数据时,该程序将停止。更加仔细的检测显示当用户键入首都名字(Quito,基多)时该程序会将它解释为请求停止运行程序!
  Bob Martin曾经看到一个系统"work once twice"。该系统在第一次处理事务时都是正确的,然后在后续的事务中无不例外地出现小错误。系统重新启动之后,它在处理第一次事务时又是很正常,但所有的后续事务处理都失败了。当Martin将该行为戏称为"work once twice"时,开发人员立刻知道去查找某个变量,程序加载时这个变量正确初始化,但是第一次事务之后就没有正确地重新设定了。
  无论在什么情况下,恰当的提问都会引导联盟的程序员迅速找了令人讨厌的bug::“你站着和坐着的时候做了不同的事情吗?我可以看看你每次的登录方式吗?”“准确地说,退出程序之前输入了什么?”“程序在开始失败之前工作正常过吗?有多少次?”
  Rick Lemons说在调试或他上过的最好的一堂课就是观看魔术表演了。魔术师玩了6个于理不能的戏法,lemons发现他自己也倾向于相信它们了。然后他提醒自己这些 于理不通的事情绝对是不可能的,他还仔细观察每一个特技,以便解开它明显的矛盾。他先从他熟悉的基本原理--物理定律--开始,从那开始着手找出每一个戏法的简单解释。这种态度使lemons成为我曾经见过的最优秀的调试员之一。
  我所见过的在关排队故障(debugging)方面的最出色的书籍要数由berton Roueche编著的《the Medical Detectives》了(该书于1991年由Penguin出版社出版)。该书的男主人公们为各种复杂的有机体消魔去病,其中有轻微恶心患者,也有重病的城镇。他们所采用的解决问题的方法可以直接应用于调试计算机系统。这些真实的故事和任何小说一样,非常具有吸引力。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值