解决WinDbg调试Dump文件不同环境mscordacwks.dll版本问题
开发人员提交一个dump文件(Windows Server 2008 R2),当前调试环境Windows Server 2012,加载sos.dl执行~* e !clrstack,提示如下错误:
Failed to load data access DLL, 0x80004005 Verify that 1) you have a recent build of the debugger (6.2.14 or newer) 2) the file mscordacwks.dll that matches your version of clr.dll is in the version directory or on the symbol path 3) or, if you are debugging a dump file, verify that the file mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path. 4) you are debugging on supported cross platform architecture as the dump file. For example, an ARM dump file must be debugged on an X86 or an ARM machine; an AMD64 dump file must be debugged on an AMD64 machine. You can also run the debugger command .cordll to control the debugger's load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload. If that succeeds, the SOS command should work on retry. If you are debugging a minidump, you need to make sure that your executable path is pointing to clr.dll as well.
当前系统mscordacwks.dll版本和dump来源系统版本不同,将来源系统对应版本的mscordacwks.dll复制到对应的搜索目录(Symbol File Path、Source File Path和Image File Path都可以),并重新加载。这个时候你会发现在Symbol File Path已经下载了对应的mscordacwks.dll运行时版本,比如:mscordacwks_AMD64_AMD64_4.0.30319.01.dll4BA21EEB965000mscordacwks_AMD64_AMD64_4.0.30319.01.dll。
继续执行~* e !clrstack,WinDbg提示如下错误:
The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. CLR Version: 4.0.30319.1 SOS Version: 4.0.30319.17929 Failed to load data access DLL, 0x80004005 Verify that 1) you have a recent build of the debugger (6.2.14 or newer) 2) the file mscordacwks.dll that matches your version of clr.dll is in the version directory or on the symbol path 3) or, if you are debugging a dump file, verify that the file mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path. 4) you are debugging on supported cross platform architecture as the dump file. For example, an ARM dump file must be debugged on an X86 or an ARM machine; an AMD64 dump file must be debugged on an AMD64 machine. You can also run the debugger command .cordll to control the debugger's load of mscordacwks.dll. .cordll -ve -u -l will do a verbose reload. If that succeeds, the SOS command should work on retry. If you are debugging a minidump, you need to make sure that your executable path is pointing to clr.dll as well.
调试机器和来源机器SOS.dll、clr.dll版本不一致,将来源机器的两个文件复制到一个指定目录。用.load命令加载这个版本的sos,再次执行~* e !clrstack,运行成功。之后执行sos的任何命令WinDbg都会提示如下信息(暂时忽略它):
The version of SOS does not match the version of CLR you are debugging. Please load the matching version of SOS for the version of CLR you are debugging. CLR Version: 4.0.30319.1 SOS Version: 4.0.30319.17929