我需要从一个程序中获取崩溃转储,该如何获取呢? 这个程序是用C#编写的。什么是崩溃转储?它是在什么时候创建的?它保存在哪里? 我该如何阅读它?
由于您提到了使用C#,我假设您正在使用Windows平台。
崩溃转储(Crashdump)或仅称为转储(Dump),是特定时间点进程的完整内存快照和其他相关系统信息。 转储可用于调试程序崩溃、挂起、内存和资源泄漏以及可能更多我未列出的问题。
在崩溃和挂起的情况下,您想要从崩溃转储中获取的第一份数据将是调用堆栈(Callstack)。 这指示了崩溃发生的位置或操作阻塞并且未返回的位置,因此程序停在那里不执行任何操作。
对于资源泄漏,可以收集一段时间内进程的多个内存转储,并进行检查以查看内存中哪些对象增长最快。 这可以帮助缩小引起泄漏的代码部分范围。 要了解有关调试特定问题的更多信息,强烈建议参考这篇博客。
有几种方法可以捕获转储文件。
使用Procdump,您可以简单地执行以下操作:
c:\>procdump.exe -ma YourProcessName.exe
这个命令的结果将会是一个完整的内存快照YourProcessName.dmp写入c:\。-ma开关指定了转储完整的内存镜像。如果您正在调试崩溃或挂起,您可能可以不用-ma开关,但请注意,如果没有完整的内存转储,当您去检查数据结构时,你可能没有有效的数据。没有完整的内存转储,您仍然会有调用堆栈数据,这通常对于崩溃和挂起情况足够好。我通常错误地认为硬盘空间很便宜,所以收集完整的转储。
Procdump还可以在时间间隔或满足特定条件时自动进行转储。阅读上面链接中的文档以了解更多信息。我推荐使用一个选项 -e。
c:\>procdump.exe -ma -e YourProcessName.exe
不要立即编写转储,只有在程序崩溃时才会进行编写。
使用Visual Studio 2010,您可以使用调试器附加到进程并保存转储文件。(请记住,当您使用F5调试程序时,Visual Studio会自动附加)。当程序处于“中断状态”(断点、未处理的异常、崩溃)时,“调试”菜单将具有“另存为转储文件...”选项。然后,您可以将该转储保存在任何您想要的位置。
由于您提到了C#,因此您很可能正在收集托管的转储文件。最简单的方法是使用Visual Studio 2010。只需像打开其他文件一样打开您创建的转储文件,然后开始调试即可。
但是,如果这不是一个选项,您始终可以使用VS2008或带有SOS扩展名的WinDbg。尽管SOS扩展名和WinDbg总体上具有相当陡峭的学习曲线,但我强烈建议使用Visual Studio 2010。要了解有关SOS的更多信息,请查看这些MSDN文章这里和这里。
我推荐使用Visual Studio或procdump的另一个原因是它们将收集您期望的转储文件。我建议避免任务管理器的“创建转储文件工具”。原因是它会收集32位进程的64位转储,这些过程过于难以调试。
userdump PID
使用ADPlus。它随附于Windows调试工具包中。 它将在其主目录下创建崩溃转储文件夹。之后,您可以使用WinDbg分析它们。
你也可以尝试使用WinDbg
崩溃转储是指将RAM内存的内容和处理器的某些部分复制到文件中。该文件在错误的关键点创建,可用于调试问题。
这在过去对我有用过。这是Windows中生成崩溃转储的键盘快捷方式。
* Start Registry Editor.
* Locate the following registry subkey:
o HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\i8042prt\Parameters
* On the Edit menu, click Add Value, and then add the following registry entry:
o Name: CrashOnCtrlScroll
Data Type: REG_DWORD
Value: 1
* Exit Registry Editor and then restart the computer.
http://vinaytechs.blogspot.com/2010/01/how-to-get-crash-or-hang-dump.html
http://msdn.microsoft.com/en-us/library/cc948909(v=vs.85).aspx