使用 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 失败” 的相关文章

  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 使用特定参数从 SQL 数据库填充组合框

    我在使用参数从 sql server 获取特定值时遇到问题 任何人都可以解释一下为什么它在 winfom 上工作但在 wpf 上不起作用以及我如何修复它 我的代码 private void UpdateItems COMBOBOX1 Ite
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐