我该如何获取崩溃转储文件?

10

我需要从一个程序中获取崩溃转储,该如何获取呢? 这个程序是用C#编写的。什么是崩溃转储?它是在什么时候创建的?它保存在哪里? 我该如何阅读它?


你的意思是需要在应用程序崩溃时创建一个转储文件,还是只需要对正在运行的应用程序进行内存转储?因为这两者实现起来有很大的不同。 - Dan Puzey
2
讲得很清楚! - Angshuman Agarwal
可能是如何为.NET获取良好的崩溃转储?的重复问题。 - Thomas Weller
5个回答

25

由于您提到了使用C#,我假设您正在使用Windows平台。

崩溃转储(Crashdump)或仅称为转储(Dump),是特定时间点进程的完整内存快照和其他相关系统信息。 转储可用于调试程序崩溃、挂起、内存和资源泄漏以及可能更多我未列出的问题。

在崩溃和挂起的情况下,您想要从崩溃转储中获取的第一份数据将是调用堆栈(Callstack)。 这指示了崩溃发生的位置或操作阻塞并且未返回的位置,因此程序停在那里不执行任何操作。

对于资源泄漏,可以收集一段时间内进程的多个内存转储,并进行检查以查看内存中哪些对象增长最快。 这可以帮助缩小引起泄漏的代码部分范围。 要了解有关调试特定问题的更多信息,强烈建议参考这篇博客

有几种方法可以捕获转储文件。

  1. Procdump (http://technet.microsoft.com/en-us/sysinternals/dd996900.aspx)
  2. Visual Studio 2010 (http://msdn.microsoft.com/en-us/library/vstudio/fk551230(v=vs.100).aspx)
  3. WinDbg - 没有其他工具那么好用,但更具威慑力

使用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位转储,这些过程过于难以调试。


2
在Windows XP上,您可以使用此实用程序创建转储文件:

http://www.microsoft.com/downloads/en/details.aspx?FamilyID=e089ca41-6a87-40c8-bf69-28ac08570b7e&displaylang=en

安装完成后,请浏览到安装目录并运行。
userdump PID

从命令行中,PID是您想要获取崩溃转储的进程的PID(可以在任务管理器中找到,但您可能需要将该列添加到标准视图中)。
然后可以在Visual Studio中打开此文件-您只需要确保已构建符号。
在Windows 7中,只需在任务管理器中右键单击进程,然后选择“创建转储文件”。

6
我强烈建议不要使用任务管理器的“创建转储文件”功能。在64位系统上它会生成32位进程的64位转储文件,这些转储文件几乎没有用处,除非你只想使用WinDbg和WOW64扩展:http://msdn.microsoft.com/en-us/library/aa384163(VS.85).aspx。 - Evan

2

使用ADPlus。它随附于Windows调试工具包中。 它将在其主目录下创建崩溃转储文件夹。之后,您可以使用WinDbg分析它们。


1

你也可以尝试使用WinDbg

http://www.windbg.org/

崩溃转储是指将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


3
CrashOnCtrlScrl 是用于在 Windows 中强制进行内核模式崩溃转储(蓝屏死机)的工具。如果 OP 正在使用 C#,这可能不是他想要的(尽管您在更新之前发布了帖子)。 - Roger Lipscombe
尽管从内核模式转储中弄清楚用户模式在做什么是可能的,但如果可以避免,我不想做更多的工作。 - Roger Lipscombe

1
Luke,崩溃转储是与应用程序状态相关的一整个数据包,在崩溃发生时记录所有这些信息到某个地方,通常是文本文件。
一种基本方法是在异常发生时记录整个堆栈跟踪,以便您稍后进行调查并查看哪个方法失败并抛出了哪个异常,参数值是什么等等。这不是真正的崩溃转储,但在许多情况下非常有帮助。
最近MS开发了一些关于崩溃转储和应用程序崩溃的东西,我想它实际上与Windows 7有关...
请参见:应用程序恢复和重启。

http://msdn.microsoft.com/en-us/library/cc948909(v=vs.85).aspx


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