我非常喜欢雪地奔驰这款游戏,买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: 1
Key : AV.Dereference
Value: NullClassPtr
Key : AV.Fault
Value: Read
Key : Analysis.CPU.mSec
Value: 843
Key : Analysis.Elapsed.mSec
Value: 72273
Key : Analysis.IO.Other.Mb
Value: 8
Key : Analysis.IO.Read.Mb
Value: 0
Key : Analysis.IO.Write.Mb
Value: 13
Key : Analysis.Init.CPU.mSec
Value: 202
Key : Analysis.Init.Elapsed.mSec
Value: 13298
Key : Analysis.Memory.CommitPeak.Mb
Value: 108
Key : Failure.Bucket
Value: NULL_CLASS_PTR_READ_c0000005_atidxx64.dll!Unknown
Key : Failure.Hash
Value: {52f8a02b-380a-20b8-c8f3-a7119650d5c9}
Key : Timeline.Process.Start.DeltaSec
Value: 27
Key : WER.OS.Branch
Value: ni_release
Key : WER.OS.Version
Value: 10.0.22621.1
Key : WER.Process.Version
Value: 9.28.1886.0
FILE_IN_CAB: CrashDump.dmp
CONTEXT: (.ecxr)
rax=0000000000000000 rbx=0000014246e19ad8 rcx=0000014248c0b400
rdx=0000014246ea0890 rsi=0000000000000000 rdi=0003241e00000000
rip=00007ffaa13803b8 rsp=00000012793fe930 rbp=00000012793fe9e9
r8=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 scope
EXCEPTION_RECORD: (.exr -1)
ExceptionAddress: 00007ffaa13803b8 (atidxx64_7ffaa1070000+0x00000000003103b8)
ExceptionCode: c0000005 (Access violation)
ExceptionFlags: 00000000
NumberParameters: 2
Parameter[0]: 0000000000000000
Parameter[1]: 0000000000000014
Attempt to read from address 0000000000000014
PROCESS_NAME: Expeditions.exe
READ_ADDRESS: 0000000000000014
ERROR_CODE: (NTSTATUS) 0xc0000005 - 0x%p 0x%p %s
EXCEPTION_CODE_STR: c0000005
EXCEPTION_PARAMETER1: 0000000000000000
EXCEPTION_PARAMETER2: 0000000000000014
IP_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: 1
STACK_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`46e9f7d0
SYMBOL_NAME: atidxx64_7ffaa1070000+3103b8
MODULE_NAME: atidxx64_7ffaa1070000
IMAGE_NAME: atidxx64.dll
STACK_COMMAND: ~27s; .ecxr ; kb
FAILURE_BUCKET_ID: NULL_CLASS_PTR_READ_c0000005_atidxx64.dll!Unknown
OS_VERSION: 10.0.22621.1
BUILDLAB_STR: ni_release
OSPLATFORM_TYPE: x64
OSNAME: Windows 10
IMAGE_VERSION: 31.0.21020.1014
FAILURE_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根目录所在的位置,再次启动游戏,游戏果然正常运行了。
困扰我两天的问题终于解决了,也算这个小众游戏全网的第一个解决方案吧。