有這麼一類Bug,它十分狡猾,一開始沒有任何問題,到了關鍵時刻就會浮出水面。
我并沒有親自調試過這類Bug,但是我知道,一定有人碰到過。
在Windows XP開發時期,有一個Bug出現在了一款遊戲中,而且這個Bug還挺有意思,它隻會在你達到下一關後才會觸發,并導緻遊戲崩潰。
經過漫長的分析調試,問題原因終于定位了。
話說這款遊戲的開發者将視訊資料計算工作在離屏緩沖區中進行,當計算過程完成後才會傳輸到實體螢幕上進行渲染。當繪制一段帶陰影的文本時,他會先在背景熵繪制一段文本,然後将坐标向右下方偏移一個像素,然後在前景色中再次繪制一次。
到目前為止,一切都還好。
隻是,開發者沒有對一種極限情況做判斷:當偏移後的坐标超過了螢幕緩沖區時。
這就是為什麼要等到更進階别之一才會出現錯誤的原因。直到那時你才完成了一個任務,其名稱包含一個帶有下降字母的小寫字母! 将下行向下移動一個像素會導緻字元中的底部像素行超出視訊緩沖區并開始損壞記憶體。
一旦發現問題,修複它就相對容易了。應用相容性團隊有一大堆技巧,其中一個叫做“HeapPadAllocation”。這個特殊的相容性修複為每個堆配置設定添加了填充,以便當程式溢出堆緩沖區時,所有被破壞的都是填充區。為壞程式啟用該修複程式(指定必要的填充量,在本例中為一行的像素值),然後再次運作遊戲。奇迹如預期般地出席:這次沒有崩潰。
令我感興趣的是,在錯誤最終浮出水面之前,你必須玩幾個小時的遊戲。
總結
應用相容性團隊,您們辛苦了。
是在下的錯。