内存转储文件是在什么时候创建的?

4
我已经配置了我的Windows 7以在崩溃时创建小型转储文件,但当我的应用程序崩溃时,没有转储文件被创建。寻找答案让我感到困惑,不知道何时会创建转储文件,是在Windows崩溃时还是在我的应用程序崩溃时?
在我的情况下,当我的应用程序崩溃时,我正在寻找转储文件。我收到一个典型的崩溃对话框,上面写着:
"TheApp 应用程序已停止工作 Windows 可以在线检查问题的解决方案 -> 在线检查解决方案并关闭程序 -> 关闭程序 -> 调试程序"
那么当我的应用程序崩溃时,我可以生成转储文件吗?我无法在开发机器上产生此错误,因此我想从转储文件中回溯。是否有其他选项来跟踪错误的源头(到源代码)?

您可以从任务管理器中创建任何正在运行的进程的转储。 - antlersoft
@antlersoft,那就是我需要的,它是在崩溃时创建的吗?如果您能指导我如何完成它。 - zar
某人调用MiniDumpWriteDump()时。如果您想要自动化,可以搜索“wer create dump”。 - Hans Passant
3个回答

5

首先,有不同的地方可以配置“崩溃时创建迷你转储”的设置,这些地方完全不同。

  1. 当 Windows 崩溃时,例如蓝屏死机(BSOD)发生时,您可以配置 Windows 创建一个内核转储文件。在 Windows 7 上进行如下设置:

    Kernel minidump for Windows crashes

  2. 当应用程序崩溃时,您可以将 Windows 配置为创建用户模式转储文件,而不是通常会出现的“Windows 错误报告”对话框。如果您事先知道这一点,则可以配置名为LocalDumps (MSDN)的注册表键。默认情况下,转储文件将被创建在%LOCALAPPDATA%\CrashDumps下,并且它们将有以下命名方案:app.exe.<PID>.dmp

    WER dialog

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

我相信您想要以上的第二个选项。如果遇到问题,请查看是否满足了本地转储条件

@antlersoft给出的答案不起作用,原因在于我在博客中发布的内容:在显示对话框时,Windows触发了断点以停止应用程序,并注入了 Windows Error Reporting 的调用堆栈。总的来说,这不是一个好的调试起点。

以下是可行的方法:

  1. 附加您选择的调试器
  2. 在调试器中按“Go”
  3. 按 WER 对话框中的“调试”按钮
  4. 确认警告(提示已经连接了调试器)
  5. 在询问是否使用所选调试器开始调试时,单击“No”

不建议使用任务管理器创建崩溃转储,因为它不会考虑应用程序的位数,这可能会在后续造成麻烦。请参阅创建良好和有用崩溃转储的方法


非常有用的答案;我不知道LocalDump注册表键。 - shrike
谢谢,是的,我肯定想要第二个选项。你帮我澄清了疑惑,如果我选择了“用户模式”转储,我确实应该期望自动生成一个迷你转储文件。但是这个转储文件的名称会是什么,它将在哪里生成? - zar
我确实跟进了@antlersoft的回答,并测试了一个新的虚拟应用程序,我故意让它崩溃,事实上,我可以通过在任务栏上右键单击来生成转储文件,所以这种方法似乎在简单的演示应用程序中有效,但我仍在调查实际问题制造的可执行文件。 - zar
1
@zar:转储文件将被创建在%LOCALAPPDATA%\CrashDumps目录下,它们的命名方案为app.exe.<PID>.dmp。 - Thomas Weller
@zar:好的。也许我需要重新测试并更新我的博客文章。如果这是一个演示应用程序的转储,你介意分享一下吗?这样我就可以看一看了。 - Thomas Weller
显示剩余4条评论

1
当Windows崩溃时,会创建Minidump。它并不是为了应用程序崩溃而设计的。
如果您想调试应用程序崩溃,可以在启动后将其附加到调试器。当应用程序崩溃时点击"调试"按钮也是同样的操作。例如,您可以使用MS Visual Studio的调试器。
请参阅此页面以获取有关将进程附加到MS Visual Studio调试器的帮助:https://msdn.microsoft.com/en-us/library/3s68z0b3.aspx

问题在于目标机器上的发布版本会崩溃。我仍然可以安装调试器,但当我从IDE启动它时,它不会发生。 - zar
即使从命令行启动,您也可以将文件附加到调试器。只需启动调试器,单击“附加进程”,然后在正在运行的进程列表中选择进程即可。您还可以在它崩溃时单击“调试”按钮进行附加。 - shrike
任务管理器不是一个好的选择,因为它不能创建正确位数的转储文件。 - Thomas Weller
@shrike: 谢谢。请看这个回答,了解位数和其他细节的重要性:https://dev59.com/D2Af5IYBdhLWcg3wOQq2#24874028 - Thomas Weller
根据Thomas Weller的回答,“这不是意图让应用程序崩溃。”这句话似乎是不正确的。如果“启动和恢复”对话框被配置为创建用户转储文件(=小内存转储?),那么当应用程序崩溃时应该会创建该文件。 - zar

1
当你收到崩溃对话框时,请打开任务管理器,找到该进程,右键单击该进程,选择“创建转储文件”。 转储文件将在用户的AppData / Local / Temp文件夹中创建; 它将被命名为%AppData%\ Local \ Temp \ .DMP; 如果您创建多个,则为-1.DMP等。 您可以将转储文件移动到开发计算机并在Visual Studio中打开它。 Visual Studio将像在调试器中运行进程时一样,模拟在崩溃点上按下“中断所有”按钮。

听起来很有前途,但您确定它在只发布“停止”工作的消息并且本质上不响应时仍会创建转储文件吗? :) - zar
1
@zar - 进程仍然在内存中,等待调试器连接,因此您可以创建一个转储。 - antlersoft
你曾经这样做过并分析过转储吗?你会很难处理它,因为它会在断点处停止而不是你想要的异常处停止。 - Thomas Weller
任务管理器不是一个好的选择,因为它不能创建正确位数的转储文件。 - Thomas Weller
有一件奇怪的事情是我的%AppData%被翻译成实际的%AppData%\Roaming文件夹,这很奇怪。 - zar
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接