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

use*_*uld 8 registry windows-server-2003

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

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

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

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

谢谢,Brian

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


FIX:发现者:John Knoeller

删除以下键

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

Joh*_*ler 9

可能这个?

如何:启用/禁用即时调试

注册表项是

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger 
Run Code Online (Sandbox Code Playgroud)


Rol*_*kas 6

删除整个键似乎太"锤"的方法.

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

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
Run Code Online (Sandbox Code Playgroud)


其次,自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
AutoExclusionList子项添加REG_DWORD值,其中名称是可执行文件的名称,值为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