有些Bug直到某些特定的时间点才会出现
有这么一类Bug,它十分狡猾,一开始没有任何问题,到了关键时刻就会浮出水面。
我并没有亲自调试过这类Bug,但是我知道,一定有人碰到过。
在Windows XP开发时期,有一个Bug出现在了一款游戏中,而且这个Bug还挺有意思,它只会在你达到下一关后才会触发,并导致游戏崩溃。
经过漫长的分析调试,问题原因终于定位了。
话说这款游戏的开发者将视频数据计算工作在离屏缓冲区中进行,当计算过程完成后才会传输到物理屏幕上进行渲染。当绘制一段带阴影的文本时,他会先在背景熵绘制一段文本,然后将坐标向右下方偏移一个像素,然后在前景色中再次绘制一次。
到目前为止,一切都还好。
只是,开发者没有对一种极限情况做判断:当偏移后的坐标超过了屏幕缓冲区时。
这就是为什么要等到更高级别之一才会出现错误的原因。直到那时你才完成了一个任务,其名称包含一个带有下降字母的小写字母! 将下行向下移动一个像素会导致字符中的底部像素行超出视频缓冲区并开始损坏内存。
一旦发现问题,修复它就相对容易了。应用兼容性团队有一大堆技巧,其中一个叫做“HeapPadAllocation”。这个特殊的兼容性修复为每个堆分配添加了填充,以便当程序溢出堆缓冲区时,所有被破坏的都是填充区。为坏程序启用该修复程序(指定必要的填充量,在本例中为一行的像素值),然后再次运行游戏。奇迹如预期般地出席:这次没有崩溃。
令我感兴趣的是,在错误最终浮出水面之前,你必须玩几个小时的游戏。
总结
应用兼容性团队,您们辛苦了。
是在下的错。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Sometimes the bug isn’t apparent until late in the game》
最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
相关文章
- 修正ECMALL在PHP5.3以上版本中无法开启支付方式的BUG
- DayDayUp:平均每篇文章1毛! 本博主自2020年6月1日起,如有任何问题可在博客贴吧留言或者私信博主(包括并不限于GUI软件编写、安装及编程语言中的bug、AI算法设计等),非诚勿扰!
- 成功解决ValueError: array must not contain infs or NaNs(花了好几个小时解决了这个最离奇的bug)
- 被灵魂问倒:这个BUG为什么没测出来?
- [C++]佛祖保佑,永无bug。C++ BUG解决方案
- 抢车位中的排名bug(比較使用了无符号数)
- 这些奇怪bug你见过吗?分享下我在测试中遇到的经典或非经典场景
- 和日期相关的代码和bug——一道力扣题中的小发现