Bug是怎么来的?
我们说,人是人他妈生的,妖是妖他妈生的,软件是程序员生的。软件是程序员的孩子,而人无完人,金无足赤!开发软件其实也要经历这些过程,程序员在生产软件,也在生产BUG!再牛逼的程序员,写出来的软件也有BUG。BUG就是软件与生俱来、不可脱逃的好基友。你碰到过的最难调试的 Bug 是什么样的?
1、程序员:王泽,
去年做 Android 开发的时候遇到一个极其搞笑的 BUG ,自我感觉有必要说出来让大家开心开心。
当时我们在做 Egret Runtime 的第一个版本,可以理解为他就是一个 Android GLSurfaceView 渲染器。
当我从开发工程师手中拿到第一个新鲜出炉热乎的开发版的时候,我发现一个现象,就是游戏整个 App 会不时崩溃掉,crash日志大概描述的是 C++ 挂掉了,当时我由于经验不足,还不会根据 C++ 的 dumpstack 去检查是哪个模块的问题。所以我决定先尝试重现一下这个问题。
重现步骤:
1、 把手机放在桌子上,打开 App,观察5分钟,未崩溃
2、 5分钟的时候接了个电话,接完后 App 崩溃
3、 意识到可能是 Android 生命周期问题导致的,于是重新打开 App,反复在前台 / 后台切换,未崩溃
4、 由于长时间弯腰盯着桌子上的手机,有些不舒服,于是把手机拿起来,想舒服的后仰坐在工位上继续重现,然后在把手机拿起来的一瞬间,崩溃。
5、 吓一跳之后,小心翼翼的重新打开 App,思索自己刚才到底做了什么,同时紧握着手中的手机继续盯着屏幕,观察5分钟,未崩溃
6、 心情暴躁,把手机扔到桌子上,崩溃
7、 惊愕......
8、 重新把手机拿起来,再次扔到桌子上,崩溃
9、 给开发的同事讲,我重现出了这个BUG,只要用力把手机往桌子上砸一下,就会崩溃
10、开发同事匪夷所思的表示没有调用过陀螺仪之类的 API,只是个简单的渲染。
11、现场演示狠狠的砸了一下我的手机,崩溃重现
12、开发同事狠狠的砸了一下他自己的测试机,未重现,于是拿过来我的手机,进行真机调试( 每次调试就要砸一下我的手机....请自行脑补我的表情)
13、最后发现,原来是当手机被狠狠砸一下的时候,屏幕旋转方向发生了改变,然后触发了 OpenGL 底层渲染的问题没有 Handle 住 ......
14、用3分钟修复了此问题,然后对着被砸了20多次的手机泪流满面.....
2、程序员:蓝牙彪
不算最难的 ,算一个比较熬人的…
最近产品验收测试阶段,几轮迭代测试都显示部分手机蓝牙都一定概率丢包……但我拿那些手机做了非常多测试 也包括和测试员的一模一样的测试环境,一直没重现。最后阶段 几个人轮番测试这个bug ,除了我大家都测试到过,但只有我有环境抓到关键log………两天两夜终于抓到了这个bug这货怎么出现的呢? 就是那些个二逼手机 有小概率出现蓝牙发呆一秒左右,什么也不做,但又在超时的允许范围,协议合法………
而我们的二逼芯片 居然只有在这个情况下才会出现一包数据呢包头标志位错误。
也就是一个手机的小概率随机错误会诱发我们的bug。
这不是关键 最最关键的是这个bug至今还躲着我,它已经面对了所有其他人员……
另外一个bug 用频谱仪抓晶振辐射 ,我一抓速度叫来了我们的射频工程师 靠 你看 这个辐射怎么变成了对称的双乳峰?不应该是正态的单峰吗? 我们一起测量了很久……后来 他不小心被电到 说:你这里没接地?怎么感觉有110V左右的交流电?
尼玛 万用表一量 真是110V ,第一次知道原来有些工程师人体可以做万用表…
3、程序员:鲁航,
在传输数据的时候,需要对字符串a做判断,如果a为空,则不下发配置,非空下发配置在我获取到a之后,我把它打印出来发现是""
嗯,什么都没有,为空,应该不下发,但当我去检查配置的时候,很奇怪的下发了
我当然认为是我的判断问题,去检查,发现没问题,判断条件和逻辑都是正确的
我觉得应该是字符串类型的问题,我又把所有判断项都转换成了unicode编码,问题仍然存在
我又更改了判断条件为a的长度为零,则不下发,问题仍然存在
为什么
为什么明明a的内容什么都没有,代码却一直认为a非空呢
a你为什么如此任性的表现你的存在感呢!
我愤怒了,身为测试转研发的我一定要解决这个bug,人定胜天……额,bug
我又重新写了一个程序,专门测试这段代码,代码逻辑仍然没问题,但是只要传输数据,他就认为a是
非空的
我逐行print各种东西,数据全对,问题存在
我查了一下字符串那部分的python源代码,代码全对,问题存在
我更换别人的机器执行这段代码,全都正常,问题存在……
最后胡乱尝试,甚至期盼掌控代码的神明或者魔法少女代码子能够出现帮我解决这个问题,
毕竟这个简单的不能再简单的问题已经卡了我将近4个小时了
直到我在一次瞎试的时候
print len(a)
屏幕结果是:2
我才恍然大悟,原来字符串a的内容,就是""
当时我大概是保持这样的动作持续了十分钟吧
而且,发生这一切的时候,我才刚刚看了@条件状语从句的回答,还在跟同时调侃哈哈哈怎么会有传输名字为null这种事发生
人生真奇妙
5、程序员:子翎,
讲一个不是自己遇到的,是从实验室小伙伴嘴里听来的。
隔壁某实验室的一个PhD童鞋quit走人了,在他走了以后,他参与开发的一个软件出现了一个神奇的bug。
bug的表现和原理很普通,但神奇之处在于,每次修改完了出问题的部分,编译出来的软件还是有这个bug,而且源文件也会抽成原来那个有bug的版本。
然后这个实验室特地从外面请了专业人士来debug,搞了个把月愣是没弄明白这个灵异现象咋回事。。
然后实验室大佬说,钱我们照付,不用继续了,请来的程序猿说,不不不!我自愿留下来接着修bug!
我就不信我调不出来了!这是职业操守!(╯‵□′)╯︵┻━┻
然后这哥们把整个系统翻了个底朝天,花了N久,最后发现这个软件使用的编译器里被人隐秘地注入了一小段代码,使得每次编译时,编译器都会先反过来编译出现bug的那段代码,强行改成有bug的版本,然后再进行正常的编译。
于是我们可以想象这个PhD在这个实验室里一定过得不太愉快→_→
这什么仇什么怨啊(╯‵□′)╯︵┻━┻
以及这个程序猿大哥真敬业。。
4、程序员:叛逆者,
我讲一个刚刚发生的事情,虽然不是最难调的,但可能是最危险的。
我们调试wp开发机的时候是通过ip连上去的。每天早上来会习惯性地刷上昨天的最新build,和一两个app。此为背景知识。
今天我也这么做了。因为刷机时间比较长,我点了刷机就离开座位干别的了。过了一阵回来之后,看到系统装好了,就继续用脚本往上装app。虽然显示app安装成功,但手机上啥都没有。我以为安装脚本又挂了,看了半天没发现有改动。就又刷了一遍机,仍然一样的结果。
后来,发现,ip变了!!!!!也就是我把别人的手机刷了!!!两次!!!!!!
我还不知道会不会有个狂暴的人突然出现把我给咔嚓了。
到目前为止,你碰到过的最难调试的 Bug 是什么样的呢?