繁体   English   中英

如何为.NET提供良好的故障转储?

[英]How do I take a good crash dump for .NET?

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

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

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

为什么在这里有点相关?

对于.NET应用程序而言,这一点很重要,原因如下:

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

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

如果你感到幸运,你也可以尝试一些指示

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

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

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

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

Visual Studio在附加到进程时显示位数: Visual Studio中的比特

可以将Process Explorer配置为显示“ Image Type列: Process Explorer中的位数

工具

自动检测位数的程序:

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

  • 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中 ,选择“Create full dump”(虽然从技术上讲,结果仍然是minidump)
  • ProcDump中 ,应用-ma命令行开关
  • 在Visual Studio中,选择“带堆的Minidump”
  • 任务管理器将始终创建具有完整内存的转储
  • 对于Windows错误报告LocalDumpsDumpType设置为2

Visual Studio说明

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

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

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

可能仅用于调试WoW64层本身。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM