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

avi*_*ivr 6 .net c# clr

我正在尝试使用微软的新库ClrMD来分析崩溃转储和实时进程.

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

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

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

ClrRuntime runtime = target.CreateRuntime(dacLocation);
Run Code Online (Sandbox Code Playgroud)

抛出此异常:

消息:加载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()

有任何想法吗?

Bob*_*dle 6

我在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而没有进一步的问题.