我如何获得崩溃转储

时间:2011-02-14 13:16:26

标签: c# debugging

我需要从程序中获取崩溃转储。我怎么得到它? 该程序是用C#编写的。什么是崩溃转储?什么时候创建?它在哪里保存? 我怎么看?

5 个答案:

答案 0 :(得分:21)

因为您说C#我假设您使用的是Windows平台。

crashdump或者只是转储,是特定时间点的进程的完整内存快照和其他相关系统信息。转储可用于调试程序崩溃,挂起,内存和资源泄漏,可能还有更多我未在此处列出的问题。

在崩溃和挂起的情况下,您要从崩溃转储中获取的第一个数据将是callstack。这表示崩溃的点或操作被阻止但从未返回的点,因此程序无所事事。

对于资源泄漏,可以在一段时间内收集进程的多个内存转储,并检查内存中哪些对象增长最多。这可以帮助缩小代码的哪些部分导致泄漏。要了解有关调试特定问题的详情,我强烈建议this blog

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

  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 - 比其他工具更糟糕但更令人生畏
  4. 使用procdump,你可以做到:

    c:\>procdump.exe -ma YourProcessName.exe
    

    此命令的结果将是写入c:\的YourProcessName.dmp的完整内存快照。 -ma开关指定转储完整的内存映像。如果您正在调试崩溃或挂起,您可能会在没有-ma开关的情况下离开。当你去检查数据结构时,请记住没有完整的内存转储,你可能没有有效的数据。如果没有完整的内存转储,您仍然会有callstack数据,这些数据通常足以导致崩溃和挂起。我通常在硬盘空间方面的错误是便宜的,所以收集完整的转储。

    Procdump还会在时间间隔或满足特定条件时自动进行转储。请阅读上面链接中的文档以获取更多信息。我建议的一个开关是-e

    c:\>procdump.exe -ma -e YourProcessName.exe
    

    不是立即编写转储,而是只在程序崩溃时写入它。

    使用Visual Studio 2010,您可以使用调试器附加到进程并保存转储文件。 (请记住,当您调试Visual Studio自动附加的程序时)。当您的程序处于“中断状态”(断点,未处理的异常,崩溃)时,Debug菜单将具有Save Dump As...选项。然后,您可以将转储保存在任何您想要的位置。

    由于您提到了C#,您很可能会收集托管转储文件。最简单的方法是使用Visual Studio 2010.只需打开您创建的转储文件,就像打开任何其他文件一样,然后开始调试。

    但是,如果这不是一个选项,您可以随时使用带有SOS扩展的VS2008或WinDbg。我强烈推荐Visual Studio 2010,因为SOS扩展和WinDbg一般都有相当陡峭的学习曲线。要了解有关SOS的更多信息,请查看这些MSDN文章herehere

    我建议使用Visual Studio或procdump的另一个原因是它们将收集您期望的转储文件。我建议转向清除任务管理器的“创建转储文件工具”。原因是它将收集64位转储的32位进程,这些进程难以调试。

答案 1 :(得分: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中,右键单击任务管理器中的进程,然后选择“创建转储文件”

答案 2 :(得分:2)

使用ADPlus。它随Windows调试工具一起提供。 它将在其主目录下创建崩溃转储文件夹。之后您可以使用WinDbg对它们进行分析。

答案 3 :(得分: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

答案 4 :(得分:1)

Luke,崩溃转储是一整套与崩溃发生时应用程序状态相关的数据,转储它意味着在某处记录所有这些信息,通常是在文本文件中。

基本方法是在发生异常时记录整个堆栈跟踪,以便稍后调查并查看哪些方法失败并抛出哪个异常,参数值是什么等等。这不是真正的挤压转储,但在很多情况下有很多帮助。

MS最近发生了一些关于崩溃转储和应用程序崩溃的事情,我认为它实际上与Windows 7有关......

请参阅此处:应用程序恢复和重新启动

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