2011-02-14 75 views
8

我需要从程序获取崩溃转储。我如何得到它?本程序是用C#编写的。什么是崩溃转储?何时创建?它保存在哪里? 我如何阅读?如何获取崩溃转储

+5

操作系统?平台?语言? – 2011-02-14 13:18:42

+0

你的意思是你需要在应用程序崩溃时创建一个dump *,或者你只需​​要运行正在运行的应用程序的内存转储?因为两者完全不同。 – 2011-02-14 13:39:36

+2

http://blogs.msdn.com/b/debugger/archive/2009/12/30/what-is-a-dump-and-how-do-i-create-one.aspx - 很好的解释! – 2013-12-28 20:58:54

回答

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 - 不坏,但超过恐吓其他工具

随着procdump,你可以简单地做:

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

该命令的结果将是YourProcessNa的完整内存快照me.dmp写入c:\。 -ma开关指定转储完整的内存映像。如果你正在调试崩溃或挂起,你可能会离开-ma开关。请记住,如果您去检查数据结构时没有完整的内存转储,则可能无法获得有效数据。如果没有完整的内存转储,您仍然可以获得通常足够用于崩溃和挂起的调用堆栈数据。我通常在硬盘空间方面的错误是便宜的,所以收集完整的转储。

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

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

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

使用Visual Studio 2010,您可以使用调试器附加到进程并保存转储文件。 (请记住,当F5调试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

您也可以尝试使用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

1

卢克,崩溃转储是目前涉及到应用程序的状态数据的整袋的碰撞已经发生,倾销就意味着某个地方记录所有这些信息,一般在一个文本文件中。

一个基本的方法是在发生异常时记录整个堆栈跟踪,以便稍后调查并查看哪种方法失败并抛出哪个异常,参数值是什么等等。这不是真正的粉碎垃圾场,但在很多情况下都有很大帮助。

有通过MS有关崩溃转储和应用程序崩溃最近开发的东西,我认为这是有关Windows 7的实际...

在这里看到:应用程序恢复和重新启动

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

2

在Windows XP中,你可以创建此工具转储文件:

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

一旦安装,浏览到命令行PID是你想要得到的崩溃转储进程的PID的安装目录,并运行

userdump PID 

(您可以在任务管理器中找到它,但你可能需要将该列添加到标准视图)。

然后可以在Visual Studio中打开此文件 - 只需确保您已构建符号。

在Windows 7只需右键点击在任务管理器的进程,并选择“创建转储文件”

2

,应使用ADPlus。它带有用于Windows的调试工具。 它会在其主目录下创建崩溃转储文件夹。之后您可以使用WinDbg分析它们。