如何为.NET做一个好的崩溃转储?

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

当使用Windows任务pipe理器创build转储时,我不知道我做错了什么。 这一直适用于32位操作系统。

我怎么能把一个良好的转储,特别是在正确的位?

为什么这里的位数是相关的?

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

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

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

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

  • 如何使用Windbgdebugging在x64机器上运行的32位.NET应用程序的转储

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

如果你不知道这个位,你可以这样找出来:

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

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

Visual Studio显示附加到进程时的位数: Visual Studio中的不稳定性

Process Explorer可以configuration为显示Image Type列: 进程资源管理器中的位数

工具

自动检测位的程序:

  • Process Explorer
  • ProcDump
  • Microsoft Visual Studio
  • Windows错误报告LocalDumps

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

  • 64位:64位操作系统的默认任务pipe理器
  • 32位:任务pipe理器在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版本

只需根据您的应用程序select比特位,而不是根据操作系统。

为什么记忆在这里相关?

对于.NET,你需要一个完整的内存转储,否则你不能找出对象的内容。 要包含完整内存,请执行以下操作:

  • 在WinDbg中,在执行.dump时指定/ma
  • 在Process Explorer中 ,select“创build完整转储”(虽然在技术上,结果仍然是一个小型转储)
  • 在ProcDump中 ,应用-ma命令行开关
  • 在Visual Studio中,select“与堆的小型转储”
  • 任务pipe理器将始终创build具有完整内存的转储
  • 对于Windows错误报告LocalDump将DumpType设置为2

Visual Studio说明

我发现许多开发人员甚至不知道Visual Studio可以创build转储。 原因可能是菜单很长一段时间不可见。 这些步骤是:

  • 启动Visual Studio:菜单是不可见的
  • 附加到进程:菜单仍然是不可见的
  • Break:菜单变得可见(在Debug / Save dump下find它)

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

可能只是为了debuggingWoW64层本身。