内存转储文件何时准确创建?

When are memory dump files exactly created?

我已经将我的 windows 7 配置为在崩溃时创建小型转储文件,但是当我的应用程序崩溃时,没有创建转储文件。搜索答案让我 confused 关于何时创建转储文件、何时 windows 崩溃或我的应用程序崩溃?

就我而言,当我的应用程序崩溃时,我正在寻找转储文件。我收到一个典型的崩溃对话框,其中指出:

TheApp Application has stopped working

Windows can check online for a solution to the problem

-> Check online for a solution and close the program

-> Close the program

-> Debug the program

那么我可以在我的应用程序崩溃时为我的应用程序生成转储文件吗?我无法在开发机器上产生这个错误,所以我想从转储文件中返回。是否有任何其他选项来跟踪错误的来源(到源代码)?

当 Windows 崩溃时创建 Minidump。它不是为了应用程序崩溃。

如果您想调试应用程序的崩溃,可以在启动后将其附加到调试器。当应用程序崩溃时单击 "Debug" 按钮执行相同的操作。例如,您可以使用 MS Visual Studio 的调试器来执行此操作。

有关将进程附加到 MS Visual Studio 调试器的帮助,请参阅此页面: https://msdn.microsoft.com/en-us/library/3s68z0b3.aspx

编辑:删除了以下文本,因为这可能无法按预期工作(Thomas 的评论)

您也可以从任务管理器创建一个转储文件,但是您仍然需要一个调试器来分析它,实际上我不确定您此时是否能够获得转储文件应用程序崩溃。如果可以的话,最好的方法是在目标机器上调试进程,方法是在它启动后或发生崩溃时将其附加到调试器。

当您看到崩溃对话框时,转到任务管理器,找到该进程,右键单击该进程,然后select "Create dump file"。转储文件在 AppData/Local/Temp 文件夹中为用户创建;它将被命名为 %AppData%\Local\Temp\.DMP;如果您创建多个,它将​​是 -1.DMP,等等。您可以将转储文件移动到您的开发机器并在 Visual Studio 内打开它。 Visual Studio 然后会像您在崩溃点点击 "Break all" 一样,而 运行 调试器中的进程。

首先,配置一个"create a minidump on crash"设置的地方不同,完全不同

  1. 您可以配置 Windows 在 Windows 崩溃时创建一个 内核 转储文件,即当蓝屏死机 (BSOD) )发生。这是在 Windows 7:

    的以下屏幕中完成的

  2. 您可以配置 Windows 在应用程序崩溃时创建 用户模式 ​​ 转储文件,即代替 "Windows Error Reporting" 对话框通常会出现。为此,您事先知道,然后 配置名为 LocalDumps (MSDN) 的注册表项。默认情况下,将在 %LOCALAPPDATA%\CrashDumps 下创建转储,它们的命名方案为 app.exe.<PID>.dmp.

  3. 为了完整起见,可能还有其他触发器。唯一确定的判断方法是:何时调用方法 MiniDumpWriteDump (MSDN)

我很确定你想要上面的选项 2。如果您遇到问题,请查看是否所有 都已满足。

@antlersoft 给出的答案不起作用,原因I have posted in my blog:在显示对话框时,Windows 已触发断点以停止应用程序并注入了Windows 错误报告的调用堆栈。总而言之,这不是一个好的调试起点。

可行的是:

  1. 附加您选择的调试器
  2. 在调试器中按 "Go"
  3. 按下 WER 对话框的 "Debug" 按钮
  4. 确认有关已附加调试器的警告
  5. 当要求使用所选调试器开始调试时单击 "No"

不建议使用任务管理器创建故障转储,因为它不会考虑应用程序的位数,这可能会在以后造成麻烦。参见 ways to create good and useful crash dumps