我在 ClrMD 的初始版本中遇到了类似的问题。它无法成功加载 WinDbg 欣然接受的 MSCORDACWKS,它位于我提供给 ClrMD 的路径中,并且可以成功地与 WinDbg 一起用于同一个转储。同样的事情发生在 DebugDiag v2 的初始版本中,据我所知,它基于 ClrMD。我在 DebugDiag 的符号路径上提供了 WinDbg 接受的相同重命名的 DAC,并且 DebugDiag 中止了分析;说 [provided] “mscordacwk.dlls 的时间戳和大小与转储中的不匹配”;即使通过 ProcMon 的加载尝试清楚地表明它正在通过 WinDbg 接受的名称访问正确的 DLL。
但是,在与我们的 Microsoft 团队合作解决 DebugDiag v2 无法加载 DAC 问题时,我能够让我们的 TAM 还提供一个名为 ClrMD 0.8.5 的“固定”ClrMD 的早期副本,该副本解决了此类问题我。这是一个 alpha 版本,我无权重新分发它,但至少你可能会在野外寻找那个版本或比 0.8.5 更新的版本。
另一件事:当使用适当的 32 位或 64 位 WinDbg 时,您通常可以只使用两个命名的 MSCORDACWKS 变体:一个用于 64 位,一个用于 32 位。因此,例如,对于从另一台机器加载 .Net 4.0.0319.1008 的 MSCORDACWKS,您可以将转储目标主机的 64 位版本从 C:\Windows\Microsoft.NET\Framework64 重命名为 mscordacwks_AMD64_AMD64_4.0.31319.1008.dll 64 位应用程序并将 32 位版本从 C:\Windows\Microsoft.NET\Framework64 重命名为 mscordacwks_x86_x86_4.0.30319.1008.dll 以获得 32 位应用程序,并且几乎可以成功。
但是,使用 ClrMD 时还有一个额外的问题。您最终可以使用 ClrMD 库尝试其他命名版本的 DAC,具体取决于您用作使用 ClrMD 编译应用程序的 Visual Studio 编译目标的位数。
当我出于习惯为 64 位目标平台构建第一个 ClrMd 测试工具时,ClrMd 正在寻找名为 mscordacwks_x86_amd64_4.0.30319.1008.dll 的库,而不是“...x86_x86...”名称。尽管我在 32 位应用程序上运行我的测试工具,但简单地从上面提到的两个重命名中的任何一个重命名 DAC 似乎都不起作用。(我并不是说我没有错;只是它对我不起作用。您的里程可能会有所不同。)
但是,一旦我将 VS2010 中的构建目标更改为 32 位,0.8.5“固定”版本会立即加载正确重命名的 mscordacwks_x86_x86_4.0.30319.1008 DLL,而不会出现其他问题。