应用程序崩溃时禁用调试提示

时间:2010-02-17 20:28:02

标签: registry windows-server-2003

问题: 我需要禁用控制台应用程序的崩溃调试提示。

背景 我们有一个应用程序可以与第三方同步信息,因为第三方在一天中的某些时间遇到连接问题而崩溃。我们无权访问源代码以正确捕获错误,因此我只需要应用程序失败并再试一次。我有另一个应用程序监视我们的同步工具,以确保它正在运行。

当同步应用程序崩溃时,会出现需要用户交互的调试提示。因为它停留在屏幕上,所以应用程序永远不会停止运行。结果是“健康 检查“永远不知道失败。”

我大约2年前做过这个,但是对于我的生活,我无法记住文章或所需的注册表路径。

谢谢, 布赖恩

操作系统:Windows 2003 Server 应用程序类型: .NET 3.5控制台应用程序


FIX:发现:John Knoeller

  

删除以下键

     

HKEY_LOCAL_MACHINE \ SOFTWARE \微软\窗户   NT \ CURRENTVERSION \的AeDebug \调试   HKEY_LOCAL_MACHINE \ SOFTWARE \微软\   .NETFramework \ DbgManagedDebugger

3 个答案:

答案 0 :(得分:9)

可能是这个?

How to: Enable/Disable Just-In-Time Debugging

注册表项是

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger 

答案 1 :(得分:6)

删除整个键似乎也是"锤子"做法。

首先,可以使用Windows API函数SetErrorMode和/或SetThreadErrorMode。它们也可以从.NET应用程序中获取。

PInvoke的相关签名是:

    public enum ErrorMode : uint
    {
        SEM_DEFAULT                 = 0x0000,
        SEM_FAILCRITICALERRORS      = 0x0001,
        SEM_NOGPFAULTERRORBOX       = 0x0002,
        SEM_NOALIGNMENTFAULTEXCEPT  = 0x0004,
        SEM_NOOPENFILEERRORBOX      = 0x8000
    }

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode SetErrorMode(ErrorMode mode);  //available since XP

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode GetErrorMode();  //available since Vista

    [DllImport("kernel32.dll", SetLastError = true)]
    public static extern bool SetThreadErrorMode(ErrorMode newMode, out ErrorMode oldMode);    //available since Windows 7

    [DllImport("Kernel32.dll")]
    public static extern ErrorMode GetThreadErrorMode();    //available since Windows 7


其次,自Vista以来,有一个更具体的基于注册表的解决方案:
仅从调试中排除此应用程序。见:

http://msdn.microsoft.com/en-us/library/windows/desktop/bb204634(v=vs.85).aspx

复制粘贴:

从自动调试中排除应用程序

以下过程介绍了在AeDebug键下的自动值设置为1后如何从自动调试中排除应用程序。

- >从自动调试中排除应用程序 转到以下注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
将REG_DWORD值添加到AutoExclusionList子项,其中名称是可执行文件的名称,值为1。
默认情况下,桌面窗口管理器(Dwm.exe)被排除在自动调试之外,否则如果Dwm.exe停止响应会导致系统死锁(用户无法看到调试器显示的界面,因为Dwm .exe没有响应,Dwm.exe无法终止,因为它由调试器保存。)
Windows Server 2003和Windows XP: AutoExclusionList子项不可用;因此,您不能从自动调试中排除任何应用程序,包括Dwm.exe。

默认的AeDebug注册表项可以表示如下:
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows NT CurrentVersion AeDebug Auto = 1 AutoExclusionList DWM.exe = 1

答案 2 :(得分:2)

John作为.reg文件的解决方案(我们需要将其推广到构建服务器集群):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Debugger"=-

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"DbgManagedDebugger"=-