如何在Windows Vista上禁用“调试/关闭应用程序”对话框?

时间:2008-12-28 16:39:28

标签: windows testing windows-vista crash-reports windows-error-reporting

当应用程序在Windows上崩溃且安装了Visual Studio等调试程序时,会出现以下模式对话框:

  

[标题:Microsoft Windows]

     

X已停止工作

     

问题导致程序停止   工作正常。 Windows将关闭   该计划并通知您是否   解决方案可用。

     

[调试] [关闭申请]

有没有办法禁用此对话框?也就是说,让程序崩溃并无声地刻录?

我的情况是我想运行几个自动化测试,其中一些会因测试中的错误而崩溃。我不希望这些对话框停止自动化运行。

搜索我认为我已经找到了在Windows XP上禁用此功能的解决方案,这是修改此注册表项:

  

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

但是,这在Windows Vista上无效。

11 个答案:

答案 0 :(得分:54)

要强制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\

答案 1 :(得分:45)

见这里:

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交谈。

答案 2 :(得分:35)

我不确定这是否指的是完全相同的对话框,但这是Raymond Chen的替代方法:

DWORD dwMode = SetErrorMode(SEM_NOGPFAULTERRORBOX);
SetErrorMode(dwMode | SEM_NOGPFAULTERRORBOX);

答案 3 :(得分:27)

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

  • GPEDIT.MSC
  • 计算机配置 - >管理模板
  • Windows组件 - > Windows错误报告
  • 将“禁止显示关键错误的用户界面”设置为“已启用”

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

答案 4 :(得分:12)

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

#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;
}

答案 5 :(得分: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 );
}

答案 6 :(得分:4)

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

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

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

答案 7 :(得分:4)

在测试期间,您可以使用'debugger' like ADPlus attached运行,可以通过许多有用的方式配置它来收集错误数据(小型转储),同时防止您在上面说明的模态对话框问题。

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

答案 8 :(得分:4)

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

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

脚本如下:

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
}

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

答案 9 :(得分:3)

在尝试了互联网上的其他所有内容以摆脱时间调试器之后,我发现了一种实际工作的简单方法,我希望能帮助其他人。

转到“控制面板” 转到“管理工具” 转到服务 查看Machine Debug Manager列表 右键单击它,然后单击“属性” 在“常规”选项卡下,查找“启动类型” 单击“禁用”。 单击“应用”和“确定”。

我从未见过调试器消息,并且我的计算机运行正常。

答案 10 :(得分:1)

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

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