晨茵舞步 发表于 2013-11-8 12:50:11

【转载】程序员,你调试过的最难的 Bug 是?

本文由 伯乐在线 - CuGBabyBeaR 翻译自 Dave Baggett。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

伯乐在线导读:调试 Bug?每个程序员工作中必须品。在 Quora 上有一个和 Bug 相关的热门问答帖:《What’s the hardest bug you’ve debugged? | 你调试过的最难 Bug 是?》。在众多回复中,Dave Baggett 的经历最让人惊叹,得到了 2400 多个顶。感谢@cugbabyebar 的热心翻译。

回想起这个bug,仍然让我有些痛苦。作为一个程序员,在发现bug时,你学会了首先在自己代码中找问题,或许在测试一万次之后,你会把问题归咎于编译器。只有在这所有的都不起作用之后,你才会把问题归咎于硬件。这是我遭遇一个硬件bug的故事。抛开别的不说,我曾为《Crash Bandicoot》写存储卡(读写)代码。对于一个自大的游戏程序员,这就像是在公园里散步一样轻松愉快,我认为只要几天就写完了。我中止调试六个礼拜。在此期间我做一些其他的事情,但我一直回来处理这个bug——几天内每天几个小时。这个bug实在烦人。这个bug的症状是,当你需要保存你的进度时,代码会访问存储卡,而大部分情况下没有什么问题…但是偶尔读写会超时…没有任何明显的原因。一个短小的写入经常毁掉存储卡。玩家要保存进度,我们不仅不保存,还擦除他们存储卡上的全部东西。天哪。过了一段时间,我们在Sony的制作人Connie Booth慌了。我们显然不能带着这个bug发布游戏,而六个星期之后我对于问题出在哪一点线索都没有。通过Connie我们向其他 PS1 开发者求助:有没有人出现过像我们这样的情况?没有。绝对没有任何人在存储卡系统上出现任何问题。在你绞尽脑汁之后,你能做的唯一一个调试方法就是分而治之:一点点去除程序中的代码,直到留下的代码很少但你仍然出问题。像木雕一样去除没有问题的代码,留下的就是你的bug所在。在这样的背景下挑战在于,视频游戏是很难去除某一部分的。在你删除模拟重力或者显示字符的代码后,如何运行游戏?你必须做的是用一个假装做真正的事情,但实际上只是做很简单的不会出现bug事情的东西来替换掉整个模块。你必须写新的支撑代码来让这些玩意正常工作。这是一个缓慢而痛苦的过程。长话短说:我做完了。我移除了大片大片的代码,相当多,只留下了初始化代码——就是准备游戏运行系统,初始化底层硬件等等。当然,我不能显示加载/保存菜单,因为我截除了所有的图像代码。但是我能够假装用户使用(不可见的)加载/保存屏幕并且请求保存,然后写入卡中。我最终以一个带有这个bug的很少量的代码结束——但问题仍然随机出现!在大多数情况下没啥问题,但是偶尔会失效。基本上所有的Crash的实际代码都被移除了,但还是这样。这实在是莫名其妙:留下来的代码基本上都没做什么事。在那时——估计是凌晨3点——一个想法蹦了出来。读写(I/O)涉及精确定时。无论是硬盘、存储卡、蓝牙发送器——随便啥——做读写的底层代码都是根据时钟来的。时钟让不直接连接到CPU的硬件设备和cpu运行的代码同步。时钟决定了波特率——数据从一头传到另一头的速率。如果计时有什么问题,硬件或者软件或者两者都会乱七八糟的。这真的,真的很糟糕,并且通常导致数据损坏。如果我们的初始化代码以某种方式弄乱了计时会怎么样?我又看了一遍测试程序中和计时有关的代码,并注意到我们将PS1上的可编程计时器设置到了1kHz(1000跳每秒)。这是比较快了,当PS1启动的时候,默认状态大概是100Hz。因此,大多数游戏将他们的计时器设置为100Hz。这个游戏的带头(和除我外的唯一)开发者Andy,将计时器设置为1kHz,使得Crash的动作计算更加准确。Andy喜欢矫枉过正,如果我们要模拟重力,我们应该尽可能的提高精度!然而如果提高计时器频率莫名其妙的干扰了整个程序的计时,故而将这个计时器设置到存储卡的波特率上会怎样呢?我将计时器代码注释掉。然后我就无法复原这个bug了。但是这并不表示bug被修复了,这个问题是随机发生的。万一我只是运气好呢?几天过去了,我还是在玩我的测试程序。Bug没有再出现。我回到全部的Crash代码中,修改了加载/保存代码,在访问存储卡之前将可编程计时器重置为默认设置(100Hz),之后设置回1kHz。从此之后没有发现问题再次出现。但是…为什么?我重新回到测试程序上,试着检测当计时器设置为1kHz时出现的那些错误的模式。终于,我注意到这些错误出现在使用PS1手柄的人身上。因为我自己很少这样做,所以我没有注意到(为啥我要在测试加载/保存代码的时候用手柄)。但是有一天我们的美工等我去完成测试(我确定那时候我在爆粗口),而他紧张的摆弄着手柄。卡损坏了。“等下,怎么回事?喂,再来一次!”一旦我发现了这两件事是联系着的,就很容易重现bug:开始写入存储卡,动一下手柄,存储卡损坏。在我看来完全是硬件bug。我去找Connie告诉他我的发现。她转述给设计过PS1的硬件工程师。她被告知:“不可能,这不可能是硬件问题。”我跟她说问一下我能不能直接和他说。那个工程师给我打电话了,他用着他的烂英语,我用着我更烂的日语,我们争论一会。我最后说:“我给你一个30行的测试程序,让你在动手柄的时候能够出现这问题。”他答应了。他向我保证,这是浪费时间,而他正在一个新项目上很忙,但因为我们是Sony很重要的开发者,他会试的。第二天晚上(我们在洛杉矶,而他在东京,所以对于我来说是晚上而他是到了第二天),他给我打电话,不好意思的向我道歉。这是个硬件问题。我还是没有完全搞清楚问题到底在哪,但是我的印象中,从Sony总部的反馈听到的是,如果将可编程计时器设置到足够高的时钟频率,会影响到主板上时钟晶振附近的一些东西。这些东西之一就是存储卡的波特率控制器,同时也设置手柄的波特率。我不是搞硬件的,所以对于细节我相当模糊。但是主旨是主板上两个独立部分的串扰,以及手柄接口和存储卡接口数据发送的结合在1kHz的时钟频率下会导致丢位,从而数据丢失,以致卡损坏。这是我全部编程生涯中,唯一一次因为量子力学debug的问题。
【原文转载自:http://blog.jobbole.com/50995/】

阎魔あい 发表于 2013-11-8 23:57:03

现在随便一个算法实验的让我调就够我把头发都拽掉了的。。。。。。。。

晨茵舞步 发表于 2013-11-9 22:42:30

等以后出来实习了,习惯调代码的节奏,这些都是浮云了~~

晨茵舞步 发表于 2013-11-9 22:42:44

阎魔あい 发表于 2013-11-8 23:57
现在随便一个算法实验的让我调就够我把头发都拽掉了的。。。。。。。。


等以后出来实习了,习惯调代码的节奏,这些都是浮云了~~

xywhere 发表于 2013-11-9 23:04:22

快考试了

阎魔あい 发表于 2013-11-10 22:41:35

晨茵舞步 发表于 2013-11-9 22:42
等以后出来实习了,习惯调代码的节奏,这些都是浮云了~~

但是现阶段还是乌云呢。。。。。。。。。

晨茵舞步 发表于 2013-11-11 00:06:27

阎魔あい 发表于 2013-11-10 22:41
但是现阶段还是乌云呢。。。。。。。。。

那就继续加油呗~~坚持就是胜利·~

阎魔あい 发表于 2013-11-11 16:59:05

晨茵舞步 发表于 2013-11-11 00:06
那就继续加油呗~~坚持就是胜利·~

学长啊。。。。工程实践中期答辩是啥时候?下学期???

晨茵舞步 发表于 2013-11-11 23:15:03

阎魔あい 发表于 2013-11-11 16:59
学长啊。。。。工程实践中期答辩是啥时候?下学期???

这个真不记得了~~计划之类的东西你可以去问老师啊~~

阎魔あい 发表于 2013-11-12 18:56:13

晨茵舞步 发表于 2013-11-11 23:15
这个真不记得了~~计划之类的东西你可以去问老师啊~~

{:7_279:}学长你这记性………………真是要命………………

晨茵舞步 发表于 2013-11-12 23:35:34

阎魔あい 发表于 2013-11-12 18:56
学长你这记性………………真是要命………………

现在人老了,记性真的不好了~~~上个月做的模块,这个月回想起来就一点都不记得了~~

阎魔あい 发表于 2013-11-14 23:16:01

晨茵舞步 发表于 2013-11-12 23:35
现在人老了,记性真的不好了~~~上个月做的模块,这个月回想起来就一点都不记得了~~

真的老了。。。。我也觉得我老了。。。。。哎,经不住折腾的赶脚!!!

晨茵舞步 发表于 2013-11-15 01:08:32

阎魔あい 发表于 2013-11-14 23:16
真的老了。。。。我也觉得我老了。。。。。哎,经不住折腾的赶脚!!!

放心吧,只会越来越老的~~

阎魔あい 发表于 2013-11-15 17:06:42

晨茵舞步 发表于 2013-11-15 01:08
放心吧,只会越来越老的~~

{:7_280:}能不要这么残忍吗。。。。。。

小马 发表于 2013-11-15 21:57:49

阎魔あい 发表于 2013-11-15 17:06
能不要这么残忍吗。。。。。。

大萍永远不老哦!!!因为本身就已经很老了,也老不到哪里去了{:7_265:}

阎魔あい 发表于 2013-11-15 22:43:14

小马 发表于 2013-11-15 21:57
大萍永远不老哦!!!因为本身就已经很老了,也老不到哪里去了

摔桌!!!不能忍!!!你应该说老娘风韵犹存~~~~

晨茵舞步 发表于 2013-11-15 22:48:01

阎魔あい 发表于 2013-11-15 17:06
能不要这么残忍吗。。。。。。

所以趁现在年轻好好疯狂啊·~

晨茵舞步 发表于 2013-11-15 22:48:19

阎魔あい 发表于 2013-11-15 17:06
能不要这么残忍吗。。。。。。

有什么梦想,什么想法,都现在开始奋斗吧·~

阎魔あい 发表于 2013-11-15 23:35:08

晨茵舞步 发表于 2013-11-15 22:48
有什么梦想,什么想法,都现在开始奋斗吧·~

我现在很憔悴啊………………再也不是当年的那个我了………………

晨茵舞步 发表于 2013-11-16 00:16:19

阎魔あい 发表于 2013-11-15 23:35
我现在很憔悴啊………………再也不是当年的那个我了………………

哈哈哈,别这样,给自己点精神,周末去happy下都好,让自己精神点~~年轻人嘛

阎魔あい 发表于 2013-11-16 08:55:08

晨茵舞步 发表于 2013-11-16 00:16
哈哈哈,别这样,给自己点精神,周末去happy下都好,让自己精神点~~年轻人嘛

已经happy不起来了啊!!!!!真的老了不爱动了!!!!!

小马 发表于 2013-11-16 10:18:51

阎魔あい 发表于 2013-11-15 22:43
摔桌!!!不能忍!!!你应该说老娘风韵犹存~~~~

风韵犹存的大萍~迷倒万千众人哦

晨茵舞步 发表于 2013-11-16 16:29:41

阎魔あい 发表于 2013-11-16 08:55
已经happy不起来了啊!!!!!真的老了不爱动了!!!!!

那是你没有机会啊~

阎魔あい 发表于 2013-11-16 17:57:54

晨茵舞步 发表于 2013-11-16 16:29
那是你没有机会啊~

又被你说出来了!!!!!!{:7_312:}更难过了。。。。

晨茵舞步 发表于 2013-11-16 21:14:02

阎魔あい 发表于 2013-11-16 17:57
又被你说出来了!!!!!!更难过了。。。。

会有的,放心吧~~~不过现在还没有到发泄的时候,先好好努力过完这阵子,之后就好多了

阎魔あい 发表于 2013-11-18 00:04:33

晨茵舞步 发表于 2013-11-16 21:14
会有的,放心吧~~~不过现在还没有到发泄的时候,先好好努力过完这阵子,之后就好多了

我怎么感觉后面的课更多………………

晨茵舞步 发表于 2013-11-18 08:22:55

阎魔あい 发表于 2013-11-18 00:04
我怎么感觉后面的课更多………………

下学期就好多了~~
页: [1]
查看完整版本: 【转载】程序员,你调试过的最难的 Bug 是?