使用ClrMD加载转储文件时“加载DAC失败:CreateDacInstance失败”

我正在尝试使用来自microsoft的新库ClrMD来分析崩溃转储和实时进程。

我已经按照.NET框架博客文章 (使用附带的.cs文件 )中的示例进行操作 。

我试图运行样本来分析.dmp文件,该文件取自与样本在同一台机器上运行的程序。

尝试创建运行时对象时,使用以下代码:

ClrRuntime runtime = target.CreateRuntime(dacLocation); 

抛出此exception:

消息:加载DAC失败:CreateDacInstance失败0x80131c30

在Microsoft.Diagnostics.Runtime.Desktop.DacLibrary.Init(String dll)

在Microsoft.Diagnostics.Runtime.Desktop.DacLibrary..ctor(DbgEngTarget dataTarget,String dll)

在Microsoft.Diagnostics.Runtime.DbgEngTarget.CreateRuntime(String dacFilename)

在DumpFetch.App..ctor()

有任何想法吗?

我在ClrMD的初始版本中遇到了类似的问题。 它无法成功加载WinDbg高兴地接受的MSCORDACWKS,在我可用于ClrMD的路径中,并且可以成功地使用WinDbg对同一个转储。 DebugDiag v2的初始版本也发生了同样的事情,据我所知,它基于ClrMD。 我在DebugDiag的符号路径上使WinDbg接受了相同的重命名DAC,DebugDiag中止了分析; 说[提供]“mscordacwk.dlls的时间戳和大小与转储中的时间戳和大小不匹配”; 即使通过ProcMon进行加载尝试,也清楚地表明它是通过WinDbg接受的名称访问正确的DLL。

但是,在与我们的Microsoft团队一起调试DebugDiag v2无法加载DAC时,我能够让我们的TAM还提供一个“固定”ClrMD的早期副本,该副本被命名为ClrMD 0.8.5,解决了这些问题。我。 这是一个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 …”名称的lib。 尽管我在32位应用程序上运行我的测试工具,但只需从上面提到的两个重命名中的任何一个重命名DAC似乎都不起作用。 (我并不是说我没有出错;只是因为它对我不起作用。你的里程可能会有所不同。)

但是,一旦我将VS2010中的构建目标更改为32位,0.8.5“固定”版本立即加载了正确重命名的mscordacwks_x86_x86_4.0.30319.1008 DLL而没有进一步的问题。

ClrVersion上还有另一种名为TryDownloadDac()的方法; 这将下载正确的一个,但你需要在与你正在调试的架构相同的架构上运行一个进程(64位应用程序调试64位,32位应用程序调试32)。 这是因为它需要将DAC库加载到内存中。