89

当应用程序在 Windows 上崩溃并安装了诸如 Visual Studio 之类的调试器时,会出现以下模式对话框:

[标题:微软视窗]

X 已停止工作

一个问题导致程序停止正常工作。如果有可用的解决方案,Windows 将关闭该程序并通知您。

[调试][关闭应用程序]

有没有办法禁用这个对话框?也就是说,程序是否只是默默地崩溃和烧毁?

我的场景是我想运行几个自动化测试,其中一些会由于被测应用程序中的错误而崩溃。我不希望这些对话框停止自动化运行。

环顾四周,我想我已经找到了在 Windows XP 上禁用此功能的解决方案,该解决方案正在破坏此 reg 密钥:

HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

但是,这在 Windows Vista 上不起作用。

4

11 回答 11

58

要强制 Windows 错误报告 (WER) 进行故障转储并关闭应用程序,而不是提示您调试程序,您可以设置以下注册表项:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting]
"ForceQueue"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\Consent]
"DefaultConsent"=dword:00000001

设置后,当您的应用程序崩溃时,您应该会在以下位置看到 *.hdmp 和 *.mdmp 文件:

%ALLUSERSPROFILE%\Microsoft\Windows\WER\
于 2008-12-28T18:47:00.697 回答
46

看这里:

http://msdn.microsoft.com/en-us/library/bb513638.aspx

注册表编辑器

DWORD HKLM 或 HKCU\Software\Microsoft\Windows\Windows 错误报告\DontShowUI = "1"

会让WER静默报告。然后你可以设置

DWORD HKLM 或 HKCU\Software\Microsoft\Windows\Windows 错误报告\禁用 = "1"

阻止它与 MS 交谈。

于 2009-02-16T21:18:19.237 回答
36

我不确定这是否指的是完全相同的对话,但这是Raymond Chen的另一种方法:

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
于 2009-01-22T00:34:20.110 回答
32

我必须禁用此功能才能在 Firefox 的 64 位 Windows 上进行发布自动化工作,并且我执行了以下操作:

  • gpedit.msc
  • 计算机配置 -> 管理模板
  • Windows 组件 -> Windows 错误报告
  • 将“防止显示严重错误的用户界面”设置为启用

客户体验报告的完成情况类似:http: //www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

于 2011-03-16T18:52:58.573 回答
13

在我的上下文中,我只想为我的单元测试而不是整个系统抑制弹出窗口。我发现需要组合功能来抑制这些错误,例如捕获未处理的异常、抑制运行时检查(例如堆栈指针的有效性)和错误模式标志。这是我成功使用的方法:

#include <windows.h>
#include <rtcapi.h>
int exception_handler(LPEXCEPTION_POINTERS p)
{
    printf("Exception detected during the unit tests!\n");
    exit(1);
}
int runtime_check_handler(int errorType, const char *filename, int linenumber, const char *moduleName, const char *format, ...)
{
    printf("Error type %d at %s line %d in %s", errorType, filename, linenumber, moduleName);
    exit(1);
}

int main()
{
    DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
    SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)&exception_handler); 
    _RTC_SetErrorFunc(&runtime_check_handler);

    // Run your tests here

    return 0;
}
于 2013-03-27T14:01:36.007 回答
8

在 WPF 应用程序中

[DllImport("kernel32.dll", SetLastError = true)]
static extern int SetErrorMode(int wMode);

[DllImport("kernel32.dll")]
static extern FilterDelegate SetUnhandledExceptionFilter(FilterDelegate lpTopLevelExceptionFilter);
public delegate bool FilterDelegate(Exception ex);

public static void DisableChashReport()
{
 FilterDelegate fd = delegate(Exception ex)
 {
  return true;
 };
 SetUnhandledExceptionFilter(fd);
 SetErrorMode(SetErrorMode(0) | 0x0002 );
}
于 2013-05-29T09:48:30.993 回答
4

您必须实现一个未处理的异常过滤器,它只是退出您的应用程序,然后使用SetUnhandledExceptionFilter()设置该过滤器函数。

如果您使用的是安全 CRT,您还必须提供自己的无效参数处理程序并使用_set_invalid_parameter_handler () 进行设置。

这篇博文也有一些信息: http ://blog.kalmbachnet.de/?postid=75

于 2008-12-28T16:56:50.137 回答
4

在测试期间,您可以使用附加的“调试器”(如 ADPlus)运行,它可以通过许多有用的方式进行配置,以收集有关错误的数据(小型转储),同时防止您在上面陈述的模式对话框问题。

如果您想在应用程序在生产中崩溃时获得一些有用的信息,您可以配置Microsoft 错误报告以获取类似于 ADPlus 数据的内容。

于 2008-12-28T17:36:01.713 回答
4

这不是问题的直接答案,因为这是一种解决方法,问题是关于如何禁用该功能,但在我的情况下,我是服务器上的用户,权限有限,无法使用以下功能之一禁用该功能其他答案。所以,我需要一个解决方法。这可能至少适用于最终解决这个问题的其他一些人。

我使用了autohotkey 便携式并创建了一个宏,它每分钟检查一次弹出框是否存在,如果存在,则单击按钮关闭程序。在我的情况下,这就足够了,并且为其他用户保留了该功能。它要求我在运行有风险的程序时启动脚本,但它可以满足我的需要。

脚本如下:

sleep_duration = 60000 ; how often to check, in milliseconds.
                       ; 60000 is a full minute

Loop
{
    IfWinExist, ahk_class #32770 ; use autohotkey's window spy to confirm that
                ; ahk_class #32770 is it for you. This seemed to be consistent
                ; across all errors like this on Windows Server 2008
    {
        ControlClick, Button2, ahk_class #32770 ; sends the click.
                ; Button2 is the control name and then the following
                ; is that window name again
    }
    Sleep, sleep_duration ; wait for the time set above
}

编辑:快速标志。当其他事情发生时,这似乎试图激活前台窗口中的控件 - 它应该将其发送到后台程序。如果我找到修复程序,我将编辑此答案以反映它,但现在,请谨慎使用它并尝试同时在机器上执行其他工作。

于 2012-08-20T21:41:15.117 回答
3

在尝试了互联网上的所有其他方法以摆脱及时调试器之后,我找到了一种实际可行的简单方法,希望对其他人有所帮助。

转到控制面板转到管理工具转到服务查看机器调试管理器的列表右键单击它并单击常规选项卡下的属性,查找启动类型单击禁用。单击应用和确定。

从那以后我就再也没有看到调试器消息,并且我的计算机运行良好。

于 2010-07-13T00:39:16.913 回答
1

您可以完全禁用 Windows Server 2008 R2、Windows Server 2012 和 Windows 8 上的错误报告,而不是更改注册表中的值:serverWerOptin /disable

https://technet.microsoft.com/en-us/library/hh875648(v=ws.11).aspx

于 2014-10-27T19:55:57.840 回答