Bug往事(4)

天刀一次測試,遇到了一個奇怪的兼容性問題。

有一個玩家,在公司電腦玩我們遊戲正常,回家就無法啟動遊戲,兩邊的電腦配置是一樣的。她發來的診斷文件,Callstack顯示第一次編譯shader就crash了。她的顯卡是660,系統是win7 64bit。這個機器配置當時遠超我們的最高配置了。

查了一下我們收集的Crash報告,第一個shader就編不過,可能顯卡太差或者dx沒裝?但這不合常理,顯卡不差,而且對方也是老玩家了,不裝DX可能不大啊。

通常應該是dx9沒有正常安裝,遊戲在安裝的時候會推薦一起安裝的,所以第一個懷疑的就是她取消了dx安裝。讓她重新單獨安裝顯卡driver,dx9,vcredist等常見的遊戲伴侶,還是不能運行。

後來她提到,安裝dx9的時候有很多次錯誤,在網上找了很多版本都一樣。DX版本包的來歷頗為可疑,作為嚴謹的開發者,我們通常不相信一切沒有親眼看見的錯誤問題。於是我果斷的問妹子要了QQ號(此處動機頗為可疑),遠程桌面協助她查看DX的安裝過程。DX9的安裝確實報了錯,但語焉不詳,沒說明是什麼具體的錯誤。

上網檢查了一下,說DX9安裝的時候會有一個Log文件存在硬碟上,讓她找到這個DiectX.log的文件,發送給我。發現一句很奇怪的錯誤

05/02/13 21:52:30: dxupdate: Currently C:WindowsSysWOW64xactengine2_0.dll is newer than the one being installed.

這句話後面又跟了很多同類的奇怪錯誤,只是文件名有一點不同。這句話大致的意思就是有一個叫做xactengine2_0.dll文件,他的版本號比我電腦上的版本舊。由於這些文件沒有被安裝,導致後續的文件,DX的DLL沒法被註冊,最終DX安裝失敗了。

疑難雜症問Google,上網找了很多帖子,沒什麼有營養的,判斷不是一個常見問題。

仔細看log,發現這裡片段很可疑:

05/02/13 21:52:30: dxupdate: RegisterDLL(): LoadLibraryEx() failed, error = 193.

05/02/13 21:52:30: dxupdate: RegisterDLL(): Unable to load C:Windowssystem32xactengine2_0.dll.

大家不妨仔細對比這一段和前一段Log文件,展開大家來找茬的精神,用力看有什麼區別。

因為用戶機器是win64位的緣故,所以32位的dll都是放在windowsSysWow64下面的,所以安裝的時候,第一次安裝程序就去那個目錄檢查,發現有這個文件,版本還更新,於是就跳過了一些安裝邏輯。

然後後續的安裝過程,windows試圖load這個library,但是居然是load windowsSystem32下面的這個文件,因為前面跳過了一些安裝邏輯,所以System32下並沒有這個文件,這樣整個安裝邏輯就失敗了。

我的猜想就是,正常版本windows肯定沒有問題,但是妹子的電腦說不定是什麼ghost版或者國內出的所謂深度精簡版。我猜想,dx的安裝邏輯,是類似這樣的:

if dll exists in SysWow64 folder and is newer than installer version

...

else

install the dll to SysWow64 and system32

Load the dll in system32

所以我認為,她的windows有問題,system32下面被精簡過了,但是沒有處理sysWow64,所以導致第一個if匹配,就沒有copy dll到system32目錄,然後去system32 loadlibrary,就失敗了。

問了一下妹子,的確是用了一個國內常見的裝機版精簡windows,這類windows兼容性堪憂啊。

只要把SysWow64裡面那個dll刪掉,就會正確!我作出了判斷。

讓妹子檢查了那兩個目錄,果然,SysWow64裡面有xactengine2_0.dll,但是system32下面沒有。讓她刪掉dll,重新安裝,但安裝還是可恥的失敗了。

這次xactengine2_0.dll安裝成功,失敗在xactengine2_1.dll。原來漏網之魚並不少,我一個個文件這樣做下來,最後把xactengine*.dll全部刪掉了,終於安裝dx成功。

但遊戲還是不能運行,查callstack還是一模一樣。我讓她發過來遊戲運行log,也看不出名堂,和之前沒有什麼不同。

聊了一會,發現妹子裝的不是最新版本的dx9。。。所以才安裝成功了。如果讓她安裝最新的dx,還是會失敗。

只好繼續看失敗log,還有一些新dll出問題,是xaudio2_0.dll。原因不贅述,把

xaudio*.dll也全部都刪掉。但是這幾個文件要管理員許可權才能刪,試了幾次,還不那麼容易,估計還被別的程序引用著。我指導妹子裝了某競品公司的電腦管理類軟體,強行刪掉那幾個DLL,然後順手把競品公司軟體卸載,保證用戶電腦幹凈。

再裝dx9,成功!遊戲順利啟動,趕在24點前幾分鐘修正了問題。

妹子表示好給力,還有三分半鐘才關服,那趕緊上去玩幾分鐘…實在是太感人了…

後續我們做了一輪排查,確保DX9的庫會被安裝到每一個用戶機器上,看了一下崩潰的資料庫,確認一下其他的啟動不能問題是不是這樣引起的,也加入了檢測代碼,今後Windows系統發生類似情況可以有更準確的診斷。

Takeaway:遇到問題,第一時間問用戶要qq號很重要,特別是漂亮妹子的qq。

題圖來自:CC0圖片網_圖片大全、免費高清圖片、免費可商用的CC0協議圖片


推薦閱讀:

Unity的一些問答
爆炸,解體,入侵,你想得到的你想不到的大BUG們
程序的錯誤叫 Bug,這個梗是怎麼來的?
malloc時出錯。提示 0xC0000374: 堆已損壞 (參數: 0x778CD8D0)什麼原因?
有誰遇到過Windows10右鍵菜單消失的Bug?

TAG:Bug | 遊戲開發 | 網路遊戲 |