问题
有很多手动方法可以使WinDBG查找没有符号存储的mscordacwks.dll (将文件放在路径中的某个位置,将其放在与windbg.exe相同的文件夹中,将其放入make文件夹,使用.cordll -lp c:\dacFolder指定WinDBG中的路径等等),但它们都只为我修复了它。我需要对所有使用我的符号商店的人进行更广泛的修正。
我能想象到的可能解决办法是:
问:是有可能的,还是有另一种我没有想到的解决问题的方法?
背景
在分析.NET过程时,我遇到了psscor2 (和sosex)在我的机器上找不到合适的mscordacwks.dll (显然很常见)的问题。WinDBG中的错误是:
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 mscorwks.dll is
in the version directory
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 the same architecture as the dump file.
For example, an IA64 dump file must be debugged on an IA64
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 mscorwks.dll as well.在这方面有很多这样的问题,也有很多好的答案,实际上所有这些都最终引用了Doug出色的博客文章mscordacwks.dll是什么?。
由于这一点,通过获得正确的mscordacwks.dll并将其放置在这里,我的情况得到了改善:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"我知道WinDBG会在哪里寻找,因为我以前曾尝试过使用!sym noisy。
所以我现在已经准备好了,但是我不得不将它放在物理上,而不是通过普通的symstore.exe机制将它添加到我的符号服务器。因为我的符号商店不仅仅是我自己使用的,所以我需要用正确的方式来让其他人使用这个商店。
这就是问题所在。当我添加使用symstore.exe而不是进入上面的路径时,它将进入:
"C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545CB1bd000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll"唯一的区别是子文件夹名在这里是4E1545CB1bd000,而不是WinDBG正在寻找的4E1545829a3000。
原因是当向符号存储添加二进制时,symstore.exe使用二进制的PE来获得图像时间戳和图像大小。在这个特定的.dll中,dumpbin.exe /headers mscordacwks.dll揭示了以下内容:
0x4E1545CB (清华7月07月01:36:11,2011年)0x1BD000因此,子文件夹名为4E1545CB1BD000。
另一方面,mscorwks.dll,正在寻找的是一个基于图像时间戳和图像大小的子文件夹,而不是mscordacwks.dll,,因为前者是加载到进程中的,而不是后者。WinDBG无法知道DAC模块的时间戳和大小,因为该模块不在进程转储中。
作为对这一解释的进一步验证,dumpbin.exe /headers mscorwks.dll揭示:
0x4E154582 (清华7月07月01时34分582011)0x9A3000您可以看到,添加到子文件夹名4E1545829A3000。
知道了这一点,现在更有意义的是,为什么人们不断接触的这么多版本的mscordacwks.dll似乎从微软的符号服务器中消失了。我肯定他们在那里,只是WinDBG和psscor2找不到他们,因为他们选择了错误的子文件夹名。为什么它甚至困扰搜索符号路径是我无法理解的,因为它保证永远不会找到它!
,所以这是我的挑战。,我能用mscorwks.dll的PE信息强迫symstore.exe添加mscordacwks.dll吗?如果没有,我是否遗漏了关于WinDBG和psscor2的一些东西,那么他们是否有办法知道mscordacwks.dll的正确时间戳和大小,即使它没有加载(以及让它们真正使用这些而不是mscorwks.dll)?
发布于 2013-10-18 05:27:04
由于没有出现任何其他解决方案,而且我的解决方案似乎处理得很好,所以我只想继续这样做,我建议其他人再也不想看到恼人的Failed to load data access DLL, 0x80004005错误了。
因此,要使这一工作为您(以及每个使用您的符号存储,所以我真的希望微软会这样做,以节省我们的麻烦)简单地将压缩的DAC文件(mscordacwks.dl_)放在正确的路径在您的本地SYM存储。
以下是我完成这一任务所遵循的步骤:
!sym noisy.cordll -ve -u -l!CLRStack或其他psscor2命令,以强制它再次加载符号C:\Symbols\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll\4E1545829a3000\mscordacwks_AMD64_AMD64_2.0.50727.4216.dll,它指示两件事:
makecab /D CompressionType=LZX /D CompressionMemory=21 mscordacwks_AMD64_AMD64_2.0.50727.4216.dll mscordacwks_AMD64_AMD64_2.0.50727.4216.dl_发布于 2016-08-31 22:34:33
您必须将CLR dll和关联的mscordacwks放在同一个文件夹中,并使用符号存储注册CLR dll。在这种情况下,符号存储将在符号存储中添加clr和mscordacwks。
更重要的是,它将使用clr的时间戳和文件大小来创建mscordacwks子文件夹,这样windbg可以在调试转储时找到m斯科dacwks dll。
mscordacwks名称必须遵循mscordacwks_ARCH_ARCH_fileversion模式,否则符号存储将不会将其添加到符号存储中。
我没有找到关于这个特性的任何文档,所以将来可能会删除它。
下面是命令和符号存储输出:
symstore.exe add /o /f 4.6.1076.00\clr.dll /t clr.dll /s \\mystore\microsoft
SYMSTORE MESSAGE: 0 alternate indexers registered
SYMSTORE MESSAGE: LastId.txt reported id 0
SYMSTORE MESSAGE: History.txt reported id 58228
SYMSTORE MESSAGE: Final id is 0000058228
SYMSTORE MESSAGE: Copying C:\Users\build.robot\symstore\4.6.1076.00\clr.dll to \\mystore\microsoft\clr.dll\56D79ED4990000\clr.dll [Force: T, Compress: F]
SYMSTORE MESSAGE: Copying 4.6.1076.00\mscordacwks_AMD64_AMD64_4.6.1076.00.dll to \\mystore\microsoft\mscordacwks_AMD64_AMD64_4.6.1076.00.dll\56D79ED4990000\mscordacwks_AMD64_AMD64_4.6.1076.00.dll [Force: T, Compress: F]
SYMSTORE: Number of files stored = 2
SYMSTORE: Number of errors = 0
SYMSTORE: Number of files ignored = 0https://stackoverflow.com/questions/19285748
复制相似问题