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

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

作者:BlogUpdater |  时间:2021-10-12 |  浏览:21 |  评论已关闭 条评论

有这么一类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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

评论已关闭。