天天看点

有些Bug直到某些特定的时间点才会出现

有这么一类Bug,它十分狡猾,一开始没有任何问题,到了关键时刻就会浮出水面。

我并没有亲自调试过这类Bug,但是我知道,一定有人碰到过。

在Windows XP开发时期,有一个Bug出现在了一款游戏中,而且这个Bug还挺有意思,它只会在你达到下一关后才会触发,并导致游戏崩溃。

经过漫长的分析调试,问题原因终于定位了。

话说这款游戏的开发者将视频数据计算工作在离屏缓冲区中进行,当计算过程完成后才会传输到物理屏幕上进行渲染。当绘制一段带阴影的文本时,他会先在背景熵绘制一段文本,然后将坐标向右下方偏移一个像素,然后在前景色中再次绘制一次。

到目前为止,一切都还好。

只是,开发者没有对一种极限情况做判断:当偏移后的坐标超过了屏幕缓冲区时。

这就是为什么要等到更高级别之一才会出现错误的原因。直到那时你才完成了一个任务,其名称包含一个带有下降字母的小写字母! 将下行向下移动一个像素会导致字符中的底部像素行超出视频缓冲区并开始损坏内存。

一旦发现问题,修复它就相对容易了。应用兼容性团队有一大堆技巧,其中一个叫做“HeapPadAllocation”。这个特殊的兼容性修复为每个堆分配添加了填充,以便当程序溢出堆缓冲区时,所有被破坏的都是填充区。为坏程序启用该修复程序(指定必要的填充量,在本例中为一行的像素值),然后再次运行游戏。奇迹如预期般地出席:这次没有崩溃。

令我感兴趣的是,在错误最终浮出水面之前,你必须玩几个小时的游戏。

总结

应用兼容性团队,您们辛苦了。

是在下的错。

最后

最近我写了个东西

继续阅读