工程师与Bug是一对相爱相杀的存在,既要在解决Bug中获得成就感,同时也讨厌自己亲手种下的Bug。最近,二姨家论坛里有网友在讨论如何调试Bug,小编今天就为大家搜集了一些号称“最难调试”的Bug,看看有没有你遇到过的?
网友Xiang Liu:
答个前段时间刚发生的,不是最难调的bug,但是确实比较虐心的。
之前用xilinx一块比较高端的开发板验证一个高速信号的功能,发现有一路输出幅度是其他的1/10,感觉很诧异,于是和师弟翻了一天手册文档,难不成这货还有配置幅度的功能。最后无解,用万用表在BGA焊盘和走线上一点一点地量,过了一个小时,发现....
尼玛一万多的板子表贴SMA接头漏焊!中间大概有0.5mm的距离,高速信号空间耦合过去10%。
于是默默用热风枪吹上,一切正常了。
这个bug的恐怖之处在于,高速信号可以从断点发射出去,然后让人误以为这有输出啊,不会想到根本就是个直流的断路,直到你用了万用表。
网友fire wind:
从前做一个嵌入式的项目,调试工具巨难用而且随机挂掉,也没有core dump,只能手工添加printf看日志调试bug。
有一天出现了一个bug,查看打印日志,修改,第二天同样的bug又出现了,但是在不同的源码处。继续添加日志,查看,修改,这过程重复了n次,每次出现bug的位置都不一样。
我突然醍醐灌顶,查看了下printf的源码...... tnnd谁把printf函数给重载了,写入还不做校验,会写到别的内存位置上去。就像是我拿个锤子到处敲地鼠,地鼠其实住在锤子里......
网友蓝牙彪:
这个bug虽然不算最难的 ,但是一个比较熬人的……
最近产品验收测试阶段,几轮迭代测试都显示部分手机蓝牙都一定概率丢包……但我拿那些手机做了非常多测试 也包括和测试员的一模一样的测试环境,一直没重现。最后阶段几个人轮番测试这个bug ,除了我大家都测试到过,但只有我有环境抓到关键log………两天两夜终于抓到了这个bug这货怎么出现的呢? 就是那些个二货手机有小概率出现蓝牙发呆一秒左右,什么也不做,但又在超时的允许范围,协议合法………
而我们的芯片居然只有在这个情况下才会出现一包数据呢包头标志位错误。
也就是一个手机的小概率随机错误会诱发我们的bug。
这不是关键,最最关键的是这个bug至今还躲着我,它已经面对了所有其他人员……
另外一个bug 用频谱仪抓晶振辐射 ,我火速叫来了我们的射频工程师:你看这个辐射怎么变成了对称的双乳峰?不应该是正态的单峰吗? 我们一起测量了很久……后来,他不小心被电到,才悠悠地说道:你这里没接地?怎么感觉有110V左右的交流电?
尼玛,万用表一量,真是110V ,第一次知道原来有些工程师人体可以做万用表……
网友陈知华:
实验室的妹子给我发消息:你的设备在群脉冲时怎么感觉显示有点跳啊(不频繁,偶尔有一两下)。
我去看,实验过程中像在有人按按键一样,显示自动在翻屏。当时第一反应是按键部分受到干扰了,把按键上的电容由0.1uF改成了0.33uF。现象倒是没是没有重现了。但怎觉哪不对。
第二天,实验室妹子又给我发消息:快过来,你的设备打静电时随机出现复位。一个周期内有时复位,有时又没事!
复位!还随机复位!!我赶过去看了现象,认为是复位电路受到干扰。
加电容,改电阻。无效!
把复位断开,无效!!
打开PCB文件,改电源线路,无效!!!
就这样两天过去了,没招了。说好的下周送检样机去现场联调呢,吃不下,睡不好。
项目负责人(副总工)落井下石,群发邮件召开会议,会上对我一阵批斗,说我硬件不行,并通知没法送检,原因是硬件有问题(实际原因是他家忙着搞装修,软件根本赶不出来,软件测试报告显示有73处bug,外加七项功能缺失),需要调整到一个月后。
我肯定不服气呀,但又没办法,只好仔细查看原理图,现在怀疑对象只剩下了下电检测(当电压下降到一定值,设备进入低功耗模式)。我把下电检测的器件拆除,把MCU的IO上拉到电源。再去实验,结果合格!!!于是对下电检测进行整改,发现问题依然解决不了。
脑抽想到群脉冲时显示乱跳,就像按键有人在按一样,便怀疑到软件没有作延时或防抖处理。
TMD软件工程师(项目负责人)居然不给我看代码,说软件不关我屁事。让我做好自己的事。这让我怎么查!!
闹僵了,项目负责人打报告到常务总监,说我有问题不去查,还要干涉他的工作。我当时内心一万头草泥马。
只好请来了总工与研发经理,说明了情况,总工说那就看看代码吧,和项目负责人沟通完,于是我们仨挤在电脑前一看源程序,瞬间奔溃。
按键检测没有防抖处理!
上电检测没有延时!
下电检查没有延时!
当场让项目负责人加了相应代码后,再做实验全部通过。梁子算是结下了!
网友Malasuth:
所谓难的bug/issue,往往是因为某些因素让你无从下手。下面我想讲3个有趣的issue来聊聊(本人在某半导体公司某显卡驱动部门做研发):
Issue 1:
国外某银行大客户在ATM机上用了答主公司n年前一款显卡,数量大约以千计。客户报告说在开机、重启或者其他一些条件下有千分之x的概率发生BSOD。bug本来assign给一个新人,新人搞不定找我帮忙。该bug的麻烦之处在于:
1. 不可能让客户寄一台ATM机给你,也不可能让你飞过去人银行里现场debug = =,只能靠dump file分析。
2. fail rate太低,定位要尽量准确,减少客户验证次数。
3. Driver太老了,以至于symbol都被IT搬到磁带上进仓库保存了。
过程不表,是因为某个空指针未检查,导致在一些特殊情况下扫描显示器状态的时候触发了BSOD。分析过程还好,主要新人对汇编不熟所以分析有点困难。你造吗,光是申请让IT把driver symbol从磁带弄回server就花了一个多星期。
Issue 2:
Windows 7; laptop, close lid action->do nothing; 用media player播放带保护的DVD,不管初始resolution如何,关、开一次lid,自动切换为1024*768。
队友查了一圈,没发现哪里明显不对,而且competitor家的都是好的= =, 所以肯定是自家某模块的问题。原因不明,就发现open lid的时候OS会change mode到1024*768。
然后每次这种要分析OS逻辑的问题都要找答主来帮忙了= =。
还好有symbol,分析起来也比较容易。dxgkrnl里有个class叫做BML(如果答主没记错的话,年代有点远了= =)负责Best Mode Logic,答主花了几天时间把BML class全部reverse engineering成C++,找到了原因:驱动把两个mode都作为preferred mode report给BML (preferred按spec有且只能有一个),然后BML就晕了。close lid/open lid之后需要挑一个resolution重新恢复,BML已晕,因此异常处理一律强制为1024*768。
告诉当时负责实现这个模块的人bug的存在以及root cause,结果人家告诉答主说这个问题他早就知道啦,本来就准备重写相应模块,会在重写的时候把bug一起修好blablabla。答主就呵呵了,黑名单+1,以后别来问我了。
不过答主也算自己有一份私有的BML代码备用。
Issue 3:
答主有时候也贱兮兮的,同事遇到有趣的问题也会主动凑上去一起分析分析,尤其是和OS行为相关。
答主同事遇到个问题,某服务器,插了8张答主公司的显卡,Windows 7,开机,发现3张在device manager里被disable了。后来发现只要插6张卡就不行,5张是好的。
可能是跨部门合作的关系,答主同事之前合作的部门偏platform,因此一直从整个系统的角度考虑问题,怀疑BIOS分配不出足够的资源,怀疑内存不够,怀疑PCI-E总线能力问题,等等。之前他们资讯了Microsoft,插8张显卡OS支持肯定没问题,而且可以最大支持256个vidpn target(我们称之为display head,可以简单理解为显示路径的数目)。
答主知道了这个问题后,就和同事一起从软件角度看。
(debug最直接的方法,就是back trace。不过因为Windows上的driver到顶了之后就是OS模块,没有代码就砍掉一堆愿意分析的人,不会分析汇编又砍掉一堆,没有symbol再砍掉一堆,愿意耐心分析下去的人其实很少。)
于是又是从驱动到OS,在OS里分析,最后发现是Windows 7对显示能力的最大路数支持有限制, 根本不是之前被告知的256好吗。。。而是32 (至少截至答主分析的那个时期的最新hotfix为止)。。。如果超过就会被判断为异常,设备无法正常enable。而且非常ugly的一点是,这个限制是通过define定义,并且用该const在watchdog.sys里构造了一个数组用来进行相应检查,都没有通过os private registry key控制的可能。那台机器上插的显卡每张都有6个display head,插到第6张的时候总数正好超过32,于是从第6张显卡开始就不能正常enable了。
答主为了验证分析,inline hack了watchdog里的部分逻辑,替换上去验证,8张卡都能enable切工作正常了。又改了driver里report capability的部分,每张卡都少report 2个display head,也能正常工作。分析结果扔给了Microsoft,也不知道后来他们改了没有。
有趣的bug,就是能让你在debug过程中享受乐趣的bug。
——以上部分内容摘自知乎
最后,附上物理学大师费曼先生修bug的一个小故事,在调试bug的路上,大家一起共勉!
我跑去看那台收音机,试着把它修好。说实在,我对它不太了解,不过旅馆里有一名杂工,记不清是他还是我,发现控制音量的可变电阻器上的旋钮松掉了,使得可变电阻器的转轴没法转动。他跑去把什么锉了几下,把旋钮固定,就把收音机修好了。
我被请去修理的下一台收音机,连一点声音也没有,原因却很简单:它的插头没有插。而随着修理任务愈趋复杂,我的手艺也愈来愈高超,花招也更多了。我在纽约买了个毫安培表,经过计算后,替它接上不同长度的细铜线,把毫安培表改装成伏特表。它并不怎么准确,但至少我能够量出线路上各接点间的大约电压值,从而晓得问题出在哪里。
其实他们之所以会请我去修理收音机,主要是因为碰上经济大衰退,大家都穷得要命,没有余钱花在修理收音机上。当他们听说有这么一个小孩能修收音机,收费又便宜,当然是趋之若骛。结果我经常要做些奇奇怪怪的工作,像爬上屋顶校正天线等;工作愈来愈困难,但我学的也愈来愈多了。我曾接过一件工作,是要将使用直流电的收音机改装为用交流电的,其中最困难的是不让它发出“嗡嗡”
的声音,而我用的方法不大对。回想起来,那次我不应该接下那件工作的,不过那时我有点不知轻重。
我在想!我在想!
另外一次也很有意思。当时我在一家印刷厂上班,印刷厂老板的朋友听说我在替人修收音机,便派人来印刷厂找我。这个人看来很穷,他的车子破烂不堪,简直是一堆废铁,而他们的屋子也坐落在城中最贫穷的地区。半路上我问:“你们的收音机出了什么毛病?”
他说:“每次我扭开开关时,它都会发出一些声音。
虽然过一阵子声音就停止,一切正常,可是我不喜欢刚开始时的声响。”
我跟自己说:“算了吧!如果你没钱,就活该忍受一点点声音!”
一路上他不停地说:“你懂收音机吗?你怎么可能会弄收音机?你只是个小孩子罢了!”他就这样不停嘴地损我,而我脑袋中一直在想:“他出了什么毛病了?只不过是一点点声音罢咧!”
可是,等我们到他家,把收音机打开时,我真的吓了一跳。一点点声音?天哪!难怪这个可怜的穷光蛋也受不了!这部收音机先是大吼大叫,不停颤动,“轰——蹦蹦蹦”地吵翻天,然后,安静下来,运作正常。我想:“怎么可能发生这种事?”
我开始来回踱步,不停地想、想、想,终于领悟到可能是收音机内各个真空管启动的次序颠倒错乱掉了——换句话说,它的扩音部分不依规矩地暖身完毕,真空管也都待命工作,但这时收音机却还没有给它任何讯号;又或者由于其他线路讯号回输,甚至收音机的前段线路——我说的是跟射频(RF, radio frequency)有关的部分——出了问题,才会发出这许多声响。而最后当射频线路全热起来,真空管电压已调适好,一切便回复正常。
那家伙不耐烦了,对我说:“你在干什么呀?我请你来修理收音机,但你只在这里走来走去!”我说:“我在想!我在想!”然后决定:“好!把所有真空管拔下来,依相反的顺序放回去。”事实上,在那个时期的收音机内,不同部分的线路上往往还是用同一型号的真空管,印象中是编号212或212A的那一种。 总之我将真空管的次序颠倒过来,再把收音机打开。它果然静得像只绵羊一样,线路乖乖地热起来,然后开始广播节目,很完美,没有任何杂音。
如果有人曾经这样瞧不起你,但你立刻展现实力,通常他们的态度会来个180度的转变, 有点补偿的意味。这位仁兄便是如此。后来,他还介绍我接其他工作,不断告诉其他人我是多伟大的天才,说:“他单靠想便把收音机修好了!”他从没想过,一个小孩子居然有能耐静下来想,然后就想出将收音机修好的方法。
死不服输那年头的收音机比较好对付,因为只要你把它拆开来之后(最大困难反而是确认该动哪一颗螺丝钉),便可看出来这是电阻,那是个电容器等等,它们甚至都贴上标签。
假如你看到电容器上的蜡已开始滴出来,那么它一定是太热,大概已烧坏了;同样,如果某个电阻上有焦碳出现,它也一定出了问题;又或者,如果你看不出什么名堂来,你可以用伏特表测量线路上的接点,看看是否都有电压。
基本上那些收音机结构都很简单,线路并不复杂。真空管的栅电压通常都是1.5或2伏特,而屏极电压都是100到伏特不等,因此对我来说,要弄清楚那些收音机的线路,看看哪里不对,把它们修好,并不算是多难的事。
不过有些时候还真蛮费时间的。记得有一次我花了足足一个下午,才找到罪魁祸首:一只看来毫无异状、实际上却已烧断的电阻。那次请我修收音机的刚好是母亲的朋友,因此我可以从容不迫地弄,没有人站在我背后说:“你现在在干什么了?”相反的,他们会跑来问我:“想不想喝点牛奶或吃块蛋糕?”不过,我后来之所以能修好那台收音机,是因为我毅力十足。从小,只要一开始研究某个谜题,我便停不下来,非要把它解开不可。如果当时我母亲的朋友跟我说:“算了,这太费事了!”我一定大为光火,因为我非要击败这台鬼收音机不可。反正这么多工夫都花了,绝不能半途而废,我必须坚持到底,直到找出它的问题才能罢休!
——以上部分内容摘自《别逗了,费曼先生》