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

2024-01-04

我正在尝试微软的新库,ClrMD https://nuget.org/packages/Microsoft.Diagnostics.Runtime,分析故障转储和实时进程。

我已遵循 .NET Framework 中的示例博客文章 http://blogs.msdn.com/b/dotnet/archive/2013/05/01/net-crash-dump-and-live-process-inspection.aspx(使用附加.cs文件 http://blogs.msdn.com/cfs-file.ashx/__key/communityserver-components-postattachments/00-10-41-54-93/ClrMDSample_2E00_cs).

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

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

ClrRuntime runtime = target.CreateRuntime(dacLocation);

抛出此异常:

Message: Failure loading DAC: CreateDacInstance failed 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)
  at DumpFetch.App..ctor()

有任何想法吗?


我在 ClrMD 的初始版本中也遇到了类似的问题。它无法成功加载 WinDbg 欣然接受的 MSCORDACWKS,该 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 位。因此,例如,要从另一台计算机加载 MSCORDACWKS for .Net 4.0.0319.1008,您可以将转储目标主机的 64 位版本从 C:\Windows\Microsoft.NET\Framework64 重命名为 mscordacwks_AMD64_AMD64_4.0.31319.1008.dll 64 位应用程序并将 C:\Windows\Microsoft.NET\Framework64 中的 32 位版本重命名为 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,而不会出现其他问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 ClrMD 加载转储文件时出现“加载 DAC 失败:CreateDacInstance 失败” 的相关文章

随机推荐