【问题标题】:How do I disable the 'Debug / Close Application' dialog on Windows Vista?如何禁用 Windows Vista 上的“调试/关闭应用程序”对话框?
【发布时间】:2010-09-28 14:58:10
【问题描述】:

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

[标题:微软视窗]

X 已停止工作

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

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

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

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

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

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

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

【问题讨论】:

  • 在 Windows XP 下,对使用调试库编译的控制台应用程序或非调试库编译 AeDebug\Debugger 键对我没有影响。

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


【解决方案1】:

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

【讨论】:

  • DefaultConsent=1 似乎是默认值。 DontShowUI 呢?
  • ForceQueue 的文档含糊不清,我不明白它的确切含义。
  • @NicJ 请将 DontShowUI=1 添加到您的答案中,这是必不可少的
  • HKEY_CURRENT_USER下也可以设置,我相信
  • windows 注册表编辑是通往 IT 地狱之路,最好考虑来自 armenzg 的回答
【解决方案2】:

看这里:

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 Error Reporting\Disabled = "1"

阻止它与 MS 交谈。

【讨论】:

  • 为我解决了我试图运行 Selenium 测试的 VSTS 构建代理问题。谢谢!
【解决方案3】:

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

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

【讨论】:

  • 是的,像这样调用 SetErrorMode 会阻止 OP 提到的 WER 对话框。
  • SetErrorMode 和 SEM_NOGPFAULTERRORBOX 标志的问题是它没有创建转储文件并在 Windows 事件日志中创建条目。您的程序在崩溃时会消失得无影无踪。出于这个原因,我认为注册表解决方案更好。
  • 这也适用于过时的框架(自 WinXP 起)。
  • 同意这不适合运送。但是,解除对自动化任务不稳定的阻塞确实很有用。
【解决方案4】:

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

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

客户体验报告在以下方面取得的成就类似: http://www.blogsdna.com/2137/fix-windows-installer-explorer-update-has-stopped-working-in-windows-7.htm

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      在 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)
      【解决方案7】:

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

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

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

      【讨论】:

        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:

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

          我使用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
          }
          

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

          【讨论】:

            【解决方案10】:

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

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

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

            【讨论】:

              【解决方案11】:

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

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2012-12-06
                • 1970-01-01
                • 1970-01-01
                • 2020-06-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多