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

时间:2013-06-25 12:54:12

标签: c# .net clr

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

我按照.NET框架中的示例blog post(使用attached .cs file)。

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

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

ClrRuntime runtime = target.CreateRuntime(dacLocation);

抛出此异常:

  

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

     

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

     

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

     

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

     

在DumpFetch.App..ctor()

有什么想法吗?

2 个答案:

答案 0 :(得分: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而没有进一步的问题。

答案 1 :(得分:1)

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