我非常喜歡雪地奔馳這款游戲,買sd的一部分也是為了它。可在我打開這個游戲時,游戲發生閃退問題。查閱了網絡各個途徑,基本沒有解決方法。因此我自己分析終于解決該問題。以下是我解決問題的思路,僅供記錄參考:
游戲在崩潰時會生成一個文件“CrashDump.dmp”,使用WinDbg讀取dmp文件,并使用分析命令,我們會得到一長串的報錯信息。
0:027> !analyze -v
*******************************************************************************
* *
* Exception Analysis *
* *
*******************************************************************************Dir entry 8, CommentStreamA stream has too many elements (0x88583 > 0x186a0)KEY_VALUES_STRING: 1Key : AV.DereferenceValue: NullClassPtrKey : AV.FaultValue: ReadKey : Analysis.CPU.mSecValue: 843Key : Analysis.Elapsed.mSecValue: 72273Key : Analysis.IO.Other.MbValue: 8Key : Analysis.IO.Read.MbValue: 0Key : Analysis.IO.Write.MbValue: 13Key : Analysis.Init.CPU.mSecValue: 202Key : Analysis.Init.Elapsed.mSecValue: 13298Key : Analysis.Memory.CommitPeak.MbValue: 108Key : Failure.BucketValue: NULL_CLASS_PTR_READ_c0000005_atidxx64.dll!UnknownKey : Failure.HashValue: {52f8a02b-380a-20b8-c8f3-a7119650d5c9}Key : Timeline.Process.Start.DeltaSecValue: 27Key : WER.OS.BranchValue: ni_releaseKey : WER.OS.VersionValue: 10.0.22621.1Key : WER.Process.VersionValue: 9.28.1886.0FILE_IN_CAB: CrashDump.dmpCONTEXT: (.ecxr)
rax=0000000000000000 rbx=0000014246e19ad8 rcx=0000014248c0b400
rdx=0000014246ea0890 rsi=0000000000000000 rdi=0003241e00000000
rip=00007ffaa13803b8 rsp=00000012793fe930 rbp=00000012793fe9e9r8=00000012793fe990 r9=00000012793fe970 r10=0000014246e19ad8
r11=0000000000000000 r12=0000000000000000 r13=0000000000000000
r14=0000014246e32f68 r15=0000000000000000
iopl=0 nv up ei pl nz na pe nc
cs=0033 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202
atidxx64_7ffaa1070000+0x3103b8:
00007ffa`a13803b8 8b4014 mov eax,dword ptr [rax+14h] ds:00000000`00000014=????????
Resetting default scopeEXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007ffaa13803b8 (atidxx64_7ffaa1070000+0x00000000003103b8)ExceptionCode: c0000005 (Access violation)ExceptionFlags: 00000000
NumberParameters: 2Parameter[0]: 0000000000000000Parameter[1]: 0000000000000014
Attempt to read from address 0000000000000014PROCESS_NAME: Expeditions.exeREAD_ADDRESS: 0000000000000014 ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p 0x%p %sEXCEPTION_CODE_STR: c0000005EXCEPTION_PARAMETER1: 0000000000000000EXCEPTION_PARAMETER2: 0000000000000014IP_ON_HEAP: 0000014246ea4c90
The fault address in not in any loaded module, please check your build's rebase
log at <releasedir>\bin\build_logs\timebuild\ntrebase.log for module which may
contain the address if it were loaded.FRAME_ONE_INVALID: 1STACK_TEXT:
00000012`793fe930 00000142`46ea4c90 : 00000142`46ea4690 00000142`46e94398 00000142`46e19ad8 00000001`000000a0 : atidxx64_7ffaa1070000+0x3103b8
00000012`793fe938 00000142`46ea4690 : 00000142`46e94398 00000142`46e19ad8 00000001`000000a0 00000142`00000010 : 0x00000142`46ea4c90
00000012`793fe940 00000142`46e94398 : 00000142`46e19ad8 00000001`000000a0 00000142`00000010 00000142`46e1f240 : 0x00000142`46ea4690
00000012`793fe948 00000142`46e19ad8 : 00000001`000000a0 00000142`00000010 00000142`46e1f240 00000142`46e936d0 : 0x00000142`46e94398
00000012`793fe950 00000001`000000a0 : 00000142`00000010 00000142`46e1f240 00000142`46e936d0 00000142`46e9f7d0 : 0x00000142`46e19ad8
00000012`793fe958 00000142`00000010 : 00000142`46e1f240 00000142`46e936d0 00000142`46e9f7d0 00000000`00000000 : 0x00000001`000000a0
00000012`793fe960 00000142`46e1f240 : 00000142`46e936d0 00000142`46e9f7d0 00000000`00000000 00000100`00000000 : 0x00000142`00000010
00000012`793fe968 00000142`46e936d0 : 00000142`46e9f7d0 00000000`00000000 00000100`00000000 00000142`48c0b901 : 0x00000142`46e1f240
00000012`793fe970 00000142`46e9f7d0 : 00000000`00000000 00000100`00000000 00000142`48c0b901 00000142`00000001 : 0x00000142`46e936d0
00000012`793fe978 00000000`00000000 : 00000100`00000000 00000142`48c0b901 00000142`00000001 00000142`46ea4c90 : 0x00000142`46e9f7d0SYMBOL_NAME: atidxx64_7ffaa1070000+3103b8MODULE_NAME: atidxx64_7ffaa1070000IMAGE_NAME: atidxx64.dllSTACK_COMMAND: ~27s; .ecxr ; kbFAILURE_BUCKET_ID: NULL_CLASS_PTR_READ_c0000005_atidxx64.dll!UnknownOS_VERSION: 10.0.22621.1BUILDLAB_STR: ni_releaseOSPLATFORM_TYPE: x64OSNAME: Windows 10IMAGE_VERSION: 31.0.21020.1014FAILURE_ID_HASH: {52f8a02b-380a-20b8-c8f3-a7119650d5c9}Followup: MachineOwner
---------
顯然,報錯信息的核心在于:
IMAGE_NAME: atidxx64.dll
報錯關鍵點在于:
FAILURE_BUCKET_ID: NULL_CLASS_PTR_READ_c0000005_atidxx64.dll!Unknown
此處我根據曾經的經驗直接上網搜索了atidxx64.dll,下載放到系統文件里進行替換,結果就是顯卡驅動損壞。這才知道這是AMD的驅動dll文件,因此到steam官網下載最新驅動重裝了顯卡驅動。思索接下來如何進行處理。
由代碼看很顯然是因為AMD的顯卡驅動出現非法訪問內存的錯誤導致整個游戲直接崩潰,而這個游戲在SteamOS可以正常運行。SteamOS主要使用Vulkan來驅動游戲,會不會是因為這個游戲不適配D3D導致的呢?
在github正好有一個叫dxvk的庫,能夠基于vulkan實現d3d11,因此我們訪問https://github.com/doitsujin/dxvk,從 Releases下載dxvk-2.3.1.tar.gz(當前最新版本),解壓壓縮包,在x64 目錄中獲取 dxgi.dll 和 d3d11.dll,并將兩個dll文件放進Snowrunner.exe根目錄所在的位置,再次啟動游戲,游戲果然正常運行了。
困擾我兩天的問題終于解決了,也算這個小眾游戲全網的第一個解決方案吧。