gpt4 book ai didi

.net - 如何为 .NET 进行良好的故障转储?

转载 作者:行者123 更新时间:2023-12-04 00:35:08 27 4
gpt4 key购买 nike

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

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

如何为 .NET 进行良好的转储,尤其是正确的位数?

最佳答案

为什么位在这里相关?

由于以下原因,位数对于 .NET 应用程序很重要:

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

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

    如果你觉得幸运,你也可以尝试一些说明
  • How to use Windbg to debug a dump of a 32bit .NET app running on a x64 machine

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

    如果你不知道位数,你可以这样找到:

    Windows 7 任务管理器显示 *32关于流程:
    Windows 7 Task Manager

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

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

    Process Explorer 可以配置为显示 Image Type柱子:
    Bitness in Process Explorer

    工具

    自动检测位数的程序:
  • Process Explorer
  • ProcDump
  • Microsoft Visual Studio
  • Windows 错误报告 LocalDumps

  • 捕获具有特定位数的转储的工具:
  • 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 中,指定 /ma当做.dump
  • Process Explorer , 选择“Create full dump”(虽然从技术上讲,结果仍然是一个小型转储)
  • ProcDump ,申请 -ma命令行开关
  • 在 Visual Studio 中,选择“带堆的小型转储”
  • 任务管理器将始终创建一个内存已满的转储
  • 对于 Windows 错误报告 LocalDumps套装DumpType2

  • Visual Studio 说明

    我发现许多开发人员甚至不知道 Visual Studio 可以创建转储。原因可能是菜单长时间不可见。这些是步骤:
  • 启动 Visual Studio:菜单不可见
  • 附加到进程:菜单仍然不可见
  • 中断:菜单变为可见(在调试/将转储另存为下找到)

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

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

    关于.net - 如何为 .NET 进行良好的故障转储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24874027/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com