如何为.NET获取一个良好的崩溃转储文件?

18

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

当使用Windows任务管理器创建转储时,我并不知道自己在做错了什么。这对32位操作系统总是有效的。

如何为.NET创建正确位数的好的转储文件?

1个回答

28

为什么位数在这里很重要?

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

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

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

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

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

如果您不知道位数,可以按照以下步骤找出它:

在Windows 7任务管理器中,进程显示* 32: Windows 7 Task Manager

在Windows 8任务管理器中,转到“详细信息”选项卡并添加名为“平台”的列: Windows 8 Task Manager

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

Process Explorer可以配置为显示“图像类型”列: Bitness in Process Explorer

工具

自动检测位数的程序:

  • Process Explorer:进程管理工具
  • ProcDump:进程转储工具
  • Microsoft Visual Studio:微软视觉化开发工具
  • Windows错误报告LocalDumps:Windows本地Dump文件生成器

捕获具有特定位数的Dump文件的工具:

  • 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,您需要完整的内存Dump文件,否则无法确定对象的内容。 若要包括完整的内存,请执行以下操作:

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

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

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

    为什么要为32位应用程序创建64位的dump文件?

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


1
也许可以添加如何确定进程是32位还是64位的方法 - 例如在win8任务管理器中,您需要显示“平台”列来确定这一点。此外,在您的标题“How to take a good...”中,也许可以考虑使用“正确”的单词而不是“好”的单词。 - wal
1
我使用VS已经有很长时间了,但不知怎么的,我竟然忽略了VS的保存转储命令! - McGuireV10

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接