【问题标题】:How do I take a good crash dump for .NET?如何为 .NET 进行良好的故障转储?
【发布时间】:2015-08-30 03:41:03
【问题描述】:

我捕获了在 64 位 Windows 操作系统上运行的 32 位 .NET 应用程序的故障转储。在分析过程中,有人发现我有一个 64 位转储,并告诉我由于位数错误,无法分析此转储。

使用 Windows 任务管理器创建转储时,我不知道自己做错了什么。这始终适用于 32 位操作系统。

我怎样才能为 .NET 提供良好的转储,尤其是使用正确的位数?

【问题讨论】:

    标签: .net windbg crash-dumps minidump


    【解决方案1】:

    为什么在这里与位相关?

    .NET 应用程序的位数很重要,原因如下:

    • 需要正确位数的 DAC(数据访问控制)库 (mscordakwks.dll)。没有可用的跨位 DAC。
    • 调试器需要能够加载正确位数的 SOS 调试扩展

    无法将转储从 64 位转换为 32 位,尽管理论上它应该包含所有必要的信息。

    如果你觉得幸运的话,你也可以尝试一些说明

    如何检测应用程序的位数?

    如果不知道位数,可以这样算:

    Windows 7 任务管理器在进程中显示*32

    在 Windows 8 任务管理器中,转到 Details 选项卡并添加名为 Platform 的列:

    Visual Studio 显示附加到进程时的位数:

    Process Explorer 可以配置为显示Image Type 列:

    工具

    自动检测位数的程序:

    捕获具有特定位数的转储的工具:

    • 64 位:64 位操作系统上的默认任务管理器
    • 32 位:任务管理器在 64 位操作系统上从 %windir%\SysWOW64\taskmgr.exe 运行
    • 64 位:ProcDump 使用-64 命令行开关运行
    • 32 位:WinDbg x86 版本
    • 64 位:WinDbg x64 版本
    • 32 位:DebugDiag x86 版本
    • 64 位:DebugDiag x64 版本
    • 32 位:ADPlus x86 版本
    • 64 位:ADPlus x64 版本

    只需根据您的应用程序选择位数,而不是根据操作系统。

    为什么在这里记忆是相关的?

    对于 .NET,您需要一个完整的内存转储,否则您无法确定对象的内容。要包含全部内存,请执行以下操作:

    • 在WinDbg中,当做.dump时指定/ma
    • Process Explorer 中,选择“创建完整转储”(虽然从技术上讲,结果仍然是小型转储)
    • ProcDump 中,应用-ma 命令行开关
    • 在 Visual Studio 中,选择“Minidump with heap”
    • 任务管理器将始终创建具有完整内存的转储
    • 对于 Windows 错误报告 LocalDumpsDumpType 设置为 2

    Visual Studio 说明

    我发现许多开发人员甚至不知道 Visual Studio 可以创建转储。原因可能是菜单长时间不可见。步骤如下:

    • 启动 Visual Studio:菜单不可见
    • 附加到进程:菜单仍然不可见
    • 中断:菜单变为可见(在“调试/转储另存为”下找到它)

    为什么要 64 位转储 32 位应用程序?

    可能只是为了调试 WoW64 层本身。

    【讨论】:

    • 也许添加如何确定进程是 32 位还是 64 位 - 例如在 win8 任务管理器中,您需要显示 Platform 列来确定这一点。在你的标题How to take a good... 中也可以考虑使用“正确”这个词而不是“好”这个词
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2016-03-21
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 1970-01-01
    相关资源
    最近更新 更多