如何重现难以遇到不能重现的bugg

等级:书童 |
热门搜索:、、、
您现在的位置:&&&&&&&&&&&&&&&&&&&&文章内容
快捷导航:
结合案例说明如何解决难以重现的Bug
来源:233网校&&&【233网校:最优秀的考试信息平台】&&&日
已有574人加入
  这一篇文将结合一个案例谈谈解决随机BUG的一些经验。我这里说的随机BUG是指那些你没法通过一些确定的步骤可靠地重现的BUG。我想做软件开发的人都会同意,即使不是最难,随机BUG应该也是最难解决的BUG类型之一。有人也许说,只要找到问题的根源就一定能可靠地重现问题,不能重现只是因为你还没找到问题的根源。这话也许没错,但也还是存在一些情况,即使找到了问题的根源也没法可靠地重现,比如我碰上的这个就属于这种情况。
  问题是这样的,我们是一家设备制造商,有自己定制的主板,在主板上开发系统软件(Kernel+Drivers),再在系统软件上构建应用软件-这在嵌入式系统开发中是比较典型的一种模式。我们有一款产品使用的平台是Strongarm SA1110+Windows CE 4.1(这在当年是很常见的一种解决方案)。问题出在关机时,有时候屏幕已经黑了,看起来设备已经完全下电,但其实内部主板的电还没掉,这时按开机键没有反应-系统lockup了。结果是只能拔掉AC电源和电池让主板下电然后才能重新开机。恶劣的情况是,如果用户只使用电池供电,而且他没意识到系统处于 lockup状态,过不了多久电量耗尽电池就会报废。
  要找出这个问题,当然必须搞清楚系统挂在了哪里,然后才能寻找对策。因此首先搞清楚系统关机的机制。
  在Windows CE中,关机操作触发后,下电过程由电源管理模块执行,大概是这样:
  1. 广播关机消息给关注该消息的 Application和Driver;
  2. 挂起图形界面子系统(GWES);
  3. 通知所有非块设备驱动(non-block drivers,这些driver可能需要访问注册表或文件因此需要在块设备驱动停止之前处理);
  4. 给 Kernel发送IOCTL_HAL_PRESUSPEND消息(OEM开发商可以利用这一消息做一些关机前处理);
  5. 禁止除电源管理模块以外的所有其他模块使用注册表和文件系统;
  6. 通知所有块设备驱动(block drivers);
  7. 关闭图形子系统;
  8. 关闭文件系统;
  9. 调用OEMPowerOff。OEMPowerOff由OEM厂商实现,执行真正的硬件下电操作。
  Windows CE系统在关机时执行的操作还是挺多的,有必要想办法缩小问题的范围。对付这种情况一种很有效的办法是在相关模块中添加打印语句输出一些调试信息。初步调查很快发现问题出在OEMPowerOff里面,OEMPowerOff是操作系统把一切事情都做完最后调用的函数,执行真正的关机操作,通常会涉及一些外设的下电和CPU的电源状态的切换。我们这个平台的关机逻辑设计有点儿怪:关机操作在一个CPLD中实现,为防止信号干扰导致的误操作,它监控CPU的两根GPIO管脚,这两根管脚信号符合特定时序时CPLD就执行关机动作。真正需要关机时,OEMPowerOff通过控制这两根GPIO管脚产生特定时序,触发CPLD的关机操作,然后CPLD依次给CPU Core和主板下电。这个设计看起来没什么问题,但是为什么会导致随机lock-up呢?我们百思不得其解。困难的地方在于这个问题极难重现,在大多数情况下关机是很正常的,反复开开关关一天也不见得能重现一次。如果找不到办法重现问题,解决方案当然也就无从谈起-即使你有再好再合理的想法,你甚至都无法验证你的想法正确与否。另一方面,客户的反馈又表明这个问题确实存在,而且随着出货量增加,案例越来越多,不容忽视。
来源:233网校-责编:zj&&&
6月8日 16:36
2013上半年软考成绩什么时候出来啊
5月27日 17:0
马上加入【软考帮帮团】啦,考后来讨论2013年5月期货从业资格考试《期货法律法规》试题和答...
5月23日 17:25
有考程序员的同学吗?大家交流交流哦~
5月16日 8:48
低价出售。。。
4月16日 16:0
根据《2013年度专业技术人员资格考试计划及有关问题的通知》得知,2013年上半年软考时间...
状态:进行中
状态:进行中
状态:进行中
状态:进行中
状态:进行中
文件类型:
文件类型:
文件类型:
文件类型:
文件类型:不可重现BUG处理方式_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
不可重现BUG处理方式
上传于|0|0|暂无简介
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢内容字号:
段落设置:
字体设置:
精准搜索请尝试:
程序员最难忘的Bug调试经历
来源:作者:CSDN责编:悠悠
相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听到自己的程序有Bug,会有各种搞笑的反应,大家可以移步去看看“程序员遇到Bug后的30种常见反应”。
目前,著名的社区问答网站Quora上出现一个很火的讨论:What's the hardest bug you've debugged?(你调试过最难的Bug是什么?)很多程序员在下面留言,把自己最痛苦或者最难忘的Bug调试经历分享给大家,笔者就所讨论的内容,整理了两位程序员的回答。不知大家是否有过同样的经历。
Dave Baggett:代码、硬件谁之过?
ITA Software联合创始人、网站创始人Dave Baggett分享了自己痛苦的调试经历,在苦苦反复测试代码后,竟然发现是硬件惹的祸。
我为Crash Bandicoot写了内存卡(加载/保存)代码,我花了6周时间才停止对这段代码进行调试,在这段时间里我还做了些其它东西,但还是会过来调试这个Bug——可能是几个小时、几天。
在每次保存进程的时候,程序就会一直访问内存卡,并且进行正常工作。仅仅一个短暂的写入操作,常常会破坏内存卡。玩家会保存一些东西,而它不但不会去保存,反而还会去破坏内存卡。
显然,我们不能跳过这个Bug,即使6周后,我仍然也没发现任何线索。后来,我们通过Connie把内容放到了PS1开发者论坛上,看是否有人遇到过类似问题?答案是否定的。
当程序员无计可施的时候,唯一能做的是对代码进行分而治之,不断地去排查错误,消灭错误,直到最后剩下非常小的一块,再去慢慢研究问题所在,可不幸往往就这样,在排除了许多错误以后,该Bug还是会出现。
在这个过程中,我们所面临的挑战是如果把代码删除了,该如何让游戏继续运行下去?我们需要替换整个模块,并且模拟一些真实的东西,但实际上,这并未起到太大作用。你必须要编写新的架构代码来保持整个游戏的运行,这是慢且痛苦的过程。
我不停的移除越来越多的代码,直到只剩下启动代码——仅仅是启动这个系统并且初始化渲染硬件等。当然,这是肯定不会提供加载/保存菜单,因为我已经移除了所有的图形代码。不过我可以假设用户在使用(不可见)加载/保存操作,并且询问是否保存,最后再写入卡上。
最后,只剩下极少的代码在工作,但Bug仍然存在,大多数时候都可以正常工作,但每隔一段时间,它就会失败。几乎所有的Crash代码都被移除了,但仍然发生错误,太莫名其妙了,剩下的代码真的没有做任何事情。
此时,大概上午3点左右,一个念头在脑海一闪而过。读和写(I/O)操作需要精确定时。无论你是否在处理一个硬盘、闪存卡、蓝牙发射机——不管怎样,底层代码的读写操作必须要根据精确的时间点来执行。
时钟周期让硬件设备可以不直接连接到CPU——并且让代码运行与CPU保持同步。时钟决定Baud Rate——数据从一端发送到另一端的速率。如果时间混乱了,那么硬件或软件都有可能会有问题,这真的是太糟糕了,而且在通常情况下,还会导致数据损坏。
倘若我们编写的设置时间的代码混乱了,那么定时会发生怎样的情形呢?我再次查看了与时间相关的测试代码,注意到设置的可编程时间定时是PS1到1kHz(1000ticks/second),这是相当快速的,大多数游戏一般都是设置在100Hz这样。
随着时间的推移,我不停地测试程序,回到Crash代码块,并且修改加载/保存代码,在访问内存卡之前,把可编程时间定时调整到默认设置(100Hz),然后再将其调制1kHz,我们再也没看到读/写问题。
为什么,我反复地思考和测试,并且不停地调整时间。有一天,我突然细微地观察到了两个东西,并且很容易重现:开始写内存卡、操纵控制器、存储卡损坏。这看起来就是个硬件Bug。
后来,我找到曾经设计过PS1的硬件工程师Connie,并且把发现的问题告诉她,她回答:“不可能”,并且我们进行了争论,我想当场测试给她看,但是她觉得是在浪费时间,并且她为新项目忙地焦头烂额。第二天,她向我道歉,并且告诉我,的确是一个硬件Bug。
图片来源:《程序员杂志》
Amir Memon:难以重现的Bug
Amir Memon是一名iOS软件工程师,他分享了一个有关Bug难以重现的调试经历。
几年前,微软和Mozilla曾报道过Flash Player会出现崩溃的现象,然后我们却无法重现这个崩溃,我们想从日志中知道在哪里崩溃,但毫无意义。后来,我们才知道,出于同样的错误,有几个崩溃记录指向了不同的代码行。
最后,我们团队里的一个很棒的质量工程师追捕到了这个崩溃所在,并且能够相当可靠地重现崩溃步骤,事实证明,只有在使用慢的硬盘驱动时才会发生。
该崩溃只会发生在一个视频被销毁后,Flash播放器破坏序列(比如在某些情况下,当你导航到另一个页面的时候)。视频文件流没有得到及时清除,随之线程同步问题暴露出来。
之所以会提这个Bug,主要是因为它很难在一个系统内部重现,事实上,在程序崩溃的地方存在不少的多线程问题。最后,我修复了这个问题,并且很受欢迎。它阻止了成千上百万个崩溃的发生。
各位程序员,你们遇到过最难忘/有趣的一次调试经历是什么?或者你认为最难的一次调试Bug是什么呢?不妨分享一下哦。
大家都在买
软媒旗下软件:
IT之家,软媒旗下科技门户网站 - 爱科技,爱这里。
Copyright (C) , All Rights Reserved.
版权所有 鲁ICP备号}

我要回帖

更多关于 不可重现bug处理 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信