Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何获得崩溃转储_C#_Debugging - Fatal编程技术网

C# 如何获得崩溃转储

C# 如何获得崩溃转储,c#,debugging,C#,Debugging,我需要从程序中获取崩溃转储。我怎么得到它? 程序是用C语言编写的。什么是崩溃转储?它是什么时候创建的?它保存在哪里? 如何阅读它?您也可以尝试使用WinDbg 崩溃转储是指将RAM内存和处理器的某些部分的内容复制到文件中。此文件是在错误的临界点创建的,可用于调试问题 这在过去对我很有效。这是在windows中进行崩溃转储的快捷键 * Start Registry Editor. * Locate the following registry subkey: o HKEY_LOCAL_

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

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

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

一种基本的方法是在异常发生时记录整个stacktrace,以便稍后进行调查,查看哪个方法失败,引发了哪个异常,参数值是什么,等等。这不是一个真正的压榨垃圾场,但在许多情况下帮助很大

微软最近开发了一些关于崩溃转储和应用程序崩溃的东西,我认为它实际上与Windows7有关

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


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

安装后,浏览到安装目录并运行

userdump PID
在命令行中,PID是要获取崩溃转储的进程的PID,您可以在任务管理器中找到它,但可能需要将该列添加到标准视图中

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


在Windows 7中,右键单击任务管理器中的进程,然后选择“创建转储文件”和“使用ADPlus”。它与Windows的调试工具一起提供。
它将在其主目录下创建崩溃转储文件夹。您可以在以后使用WinDbg对其进行分析。

因为您说的是C,所以我假设您使用的是Windows平台

crashdump或just dump是进程在特定时间点的完整内存快照和其他相关系统信息。转储可以用来调试程序崩溃、挂起、内存和资源泄漏,可能还有更多我在这里没有列出的问题

在崩溃和挂起的情况下,您希望从崩溃转储获取的第一条数据将是callstack。这表示崩溃点或某个操作被阻止且从未返回的点,因此程序处于静止状态而不执行任何操作

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

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

程序转储 VisualStudio2010 WinDbg-不错,但比其他工具更吓人 使用procdump,您只需执行以下操作:

c:\>procdump.exe -ma YourProcessName.exe
此命令的结果将是写入c:\的YourProcessName.dmp的完整内存快照。-ma开关指定转储完整的内存映像。如果您正在调试崩溃或挂起,您可能不需要使用-ma开关就可以逃脱。请记住,如果没有完整的内存转储,当您检查数据结构时,您可能没有有效的数据。如果没有完整的内存转储,您仍然会有callstack数据,这些数据通常足以应付崩溃和挂起。我通常错误的一面是硬盘空间很便宜,所以收集完整的转储文件

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

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

使用Visual Studio 2010,您可以使用调试器附加到进程并保存转储文件。请记住,当您进行F5调试时,Visual Studio会自动附加程序。当程序处于中断状态断点、未处理的异常、崩溃时,“调试”菜单将具有将转储另存为…的选项。。。。然后你可以把垃圾存放在任何你想要的地方

因为您提到了C,所以您很可能正在收集托管转储文件。最简单的方法是使用VisualStudio2010。简单地说,像打开任何其他文件一样打开您创建的转储文件并开始调试

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

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

您的意思是当应用程序崩溃时需要创建转储,还是只需要对正在运行的应用程序进行内存转储?因为两者的实现方式截然不同解释得很好!CrashOnCtrlScrl的可能副本用于在Windows中强制内核模式崩溃转储蓝屏死机。如果OP使用的是C,这可能比他想要的要多,尽管你在更新之前发布了;如果可以避免的话,这比我想做的要多。我强烈建议不要使用任务管理器的创建转储文件。在64位系统上,它创建32位进程的64位转储。除非您只想使用WinDbg和WOW64扩展名,否则这些转储文件几乎毫无用处。
c:\>procdump.exe -ma -e YourProcessName.exe