我如何获得崩溃转储

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

既然你说C#我假设你使用的是Windows平台。

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

在崩溃和挂起的情况下,您要从崩溃转储中获取的第一个数据将是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 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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