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


86

当应用程序在Windows上崩溃并且安装了调试器(例如Visual Studio)时,将出现以下模式对话框:

[标题:Microsoft Windows]

X已停止工作

问题导致程序停止正常运行。Windows将关闭程序并通知您是否有解决方案。

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

有没有办法禁用此对话框?也就是说,程序是否只是崩溃并以静默方式刻录?

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

到处搜索我认为我已经找到了在Windows XP上禁用此功能的解决方案,这是在破坏此reg键:

HKLM \软件\ Microsoft \ Windows NT \ CurrentVersion \ AeDebug \ Debugger

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


在Windows XP下,无论是在使用调试库还是未调试库编译的控制台应用程序上,对AeDebug \ Debugger密钥进行核对我都无效。
rptb1

Answers:


56

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

3
DefaultConsent = 1似乎是默认值。那DontShowUI呢?
Zitrax 2011年

ForceQueue的文档含糊不清,我不清楚它的含义。
Zitrax 2011年

2
@NicJ,请在您的答案中添加DontShowUI = 1,这是必不可少的
Youda008 2014年

1
我相信,也可以在HKEY_CURRENT_USER下设置
PJTraill

2
Windows注册表编辑是通向IT地狱的方法,最好考虑armenzg的回答
lowtech

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错误报告\ Disabled =“ 1”

阻止它与MS通话。


为我解决了试图运行Selenium测试的VSTS Build Agent问题。谢谢!
Stu1986C

36

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

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

是的,这样调用SetErrorMode可以防止OP提及WER对话框。
罗曼·斯塔科夫

2
我与SetErrorMode和SEM_NOGPFAULTERRORBOX标志有关的问题是,它不会创建转储文件,也不会在Windows事件日志中进行输入。您的程序崩溃时将消失得无影无踪。因此,我认为注册表解决方案更好。
德里克(Derek)

这也适用于过时的框架(自WinXP起)。
狼”

1
同意将其随带是不好的。但是,对不稳定的自动化任务进行解锁确实很有用。
kayleeFrye_onDeck


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

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

看起来那里没有WPF特定的东西,并且似乎也可以在我的控制台应用程序中正常工作(Windows 10中为.NET 4.6.2)
mookid8000 '19



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
}

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


3

在尝试了Internet上的其他所有功能以摆脱及时调试器之后,我发现了一种实际可行的简单方法,希望对其他人有所帮助。

转到控制面板转到管理工具转到服务向下查看Machine Debug Manager的列表,右键单击它,然后在General选项卡下单击Properties,查找Startup Type,然后单击Disable。单击“应用”,然后单击“确定”。

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.