如何为.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理器在进程上显示*32
:
在Windows 8任务pipe理器中,转到“ Details
选项卡并添加一个名为“ Platform
的列:
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层本身。