【问题标题】:Disable debug prompt on application crash在应用程序崩溃时禁用调试提示
【发布时间】:2011-01-18 01:18:32
【问题描述】:

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

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

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

我大约在 2 年前完成了这项工作,但在我的一生中,我无法记住这篇文章或所需的注册表路径。

谢谢, 布赖恩

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


FIX:发现者:John Knoeller

删除以下键

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\调试器 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ .NETFramework\DbgManagedDebugger

【问题讨论】:

标签: registry windows-server-2003


【解决方案1】:

删除整个键似乎过于“锤”的方法。

首先,可以使用 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


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

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

复制粘贴:

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

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

--> 从自动调试中排除应用程序 转到以下注册表项:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
AutoExclusionList子项中添加一个REG_DWORD值,其中名称为可执行文件的名称,值为1。
默认情况下,桌面窗口管理器 (Dwm.exe) 从自动调试中排除,否则如果 Dwm.exe 停止响应(用户无法看到调试器显示的界面,因为 Dwm.exe)可能会发生系统死锁。 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

【讨论】:

  • +1,要求在程序运行的每台机器上更改注册表项会令人沮丧。使用 API 调用会更好!
【解决方案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"=-

【讨论】:

    【解决方案3】:

    可能是这个?

    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 
    

    【讨论】:

    • 完全正确!!谢谢!注意:如果您没有安装 VS,请向下滚动到注册表路径 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger
    • 链接已失效,最好提供答案而不仅仅是链接(见meta.stackexchange.com/a/8259)。
    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    相关资源
    最近更新 更多