C++ 什么时候创建内存转储文件?

C++ 什么时候创建内存转储文件?,c++,debugging,windows-7,crash,C++,Debugging,Windows 7,Crash,我已将windows 7配置为在崩溃时创建迷你转储文件,但当我的应用程序崩溃时,没有创建转储文件。对答案的搜索让我想起了何时创建转储文件、何时windows崩溃或何时我的应用程序崩溃 在我的例子中,当我的应用程序崩溃时,我正在寻找转储文件。我收到一个典型的崩溃对话框,其中说明: 应用程序已停止工作 Windows可以联机检查该问题的解决方案 ->联机检查解决方案并关闭程序 ->关闭程序 ->调试程序 那么,当我的应用程序崩溃时,我可以为它生成转储文件吗?我不能在开发机器上产生这个bug,所以我想

我已将windows 7配置为在崩溃时创建迷你转储文件,但当我的应用程序崩溃时,没有创建转储文件。对答案的搜索让我想起了何时创建转储文件、何时windows崩溃或何时我的应用程序崩溃

在我的例子中,当我的应用程序崩溃时,我正在寻找转储文件。我收到一个典型的崩溃对话框,其中说明:

应用程序已停止工作

Windows可以联机检查该问题的解决方案

->联机检查解决方案并关闭程序

->关闭程序

->调试程序


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

当Windows崩溃时,会创建迷你转储。它并不是为了让应用程序崩溃

如果要调试应用程序的崩溃,可以在启动后将其附加到调试器。当应用程序崩溃时,单击“调试”按钮也会这样做。例如,您可以使用MS Visual Studio的调试器来执行此操作

有关将进程附加到MS Visual Studio调试器的帮助,请参见此页:

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


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

当您获得崩溃对话框时,转到任务管理器,找到该进程,右键单击该进程,然后选择“创建转储文件”。转储文件在用户的AppData/Local/Temp文件夹中创建;它将被命名为%AppData%\Local\Temp\.DMP;如果创建多个文件,它将是-1.DMP,等等。您可以将转储文件移动到开发机器上,并在Visual Studio中打开它。然后,Visual Studio将表现为在调试程序中运行进程时,在崩溃点点击“全部中断”按钮。

首先,有不同的位置可以配置“在崩溃时创建小型转储”设置,这是完全不同的

  • 您可以将Windows配置为在Windows崩溃时,即出现死机蓝屏(BSOD)时创建内核转储文件。这是在Windows 7的以下屏幕中完成的:

  • 您可以将Windows配置为在应用程序崩溃时创建用户模式转储文件,而不是通常出现的“Windows错误报告”对话框。要执行此操作,您必须事先知道,然后配置名为的注册表项。默认情况下,转储将在
    %LOCALAPPDATA%\CrashDumps
    下创建,并具有命名方案
    app.exe..dmp

  • 为了完整性,可能还有其他触发器。唯一确定的方法是:何时调用该方法

  • 我很确定你想要上面的选项2。如果你在这方面有困难,看看是否所有的任务都完成了

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

    有效的方法是:

  • 附加您选择的调试器
  • 在调试器中按“Go”
  • 按下WER对话框的“调试”按钮
  • 确认有关已附加的调试器的警告
  • 当要求使用所选调试器开始调试时,单击“否”

  • 不推荐使用任务管理器创建崩溃转储,因为它不会考虑应用程序的易失性,这可能会在以后引起麻烦。请参阅。

    您可以从任务管理器中的任何正在运行的进程创建转储。@antlersoft这正是我需要的,它是在崩溃时创建的吗?如果你能告诉我是怎么做的。当有人调用MiniDumpWriteDump()时。如果你想让它自动化,谷歌“wer create dump”。问题是崩溃发生在目标机器上的发布构建中。我仍然可以安装调试器,但从IDE启动调试器时不会发生这种情况。即使从命令行启动调试器,也可以将文件附加到调试器。只需启动调试器并单击“附加进程”,然后在正在运行的进程列表中选择该进程。您也可以单击“调试”按钮,在它崩溃后附加它。任务管理器不是一个好的选择,因为它不会创建正确位的转储。@shrike:谢谢。看看为什么bitness和其他东西很重要。根据Thomas Weller的回答,“它不是为了应用程序崩溃。”这句话似乎不正确。如果将“启动和恢复”对话框配置为创建用户转储文件(=小内存转储?),则应在应用程序崩溃时创建该文件?这听起来很有希望,但您是否确定,当它只是发出一条消息,表明它已停止工作且基本上没有响应时,它仍将创建转储文件?:)@zar-进程仍在内存中,可以让调试器附加,因此您可以创建转储。您是否执行过此操作,并因此分析了转储?您将很难使用它,因为它会在断点处停止,而不是您希望出现的异常。任务管理器不是一个好的选择,因为它不会创建正确比特数的转储。因此,请将您的答案与@ThomasWeller结合起来,我相信这个文件可能是自动创建的,因为我已经为
    用户模式选择了迷你转储文件?但我在%AppData%文件夹中找不到该文件。那里没有文件,只有文件夹。转储文件的名称应该是什么?非常有用的答案;没有