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

问题描述 投票:0回答:4

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

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

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

我大约两年前就完成了此操作,但我一生都无法记住这篇文章或所需的注册表路径。

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


修复:发现者:John Knoeller

删除以下键

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\调试器 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft

.NETFramework\DbgManagedDebugger

registry windows-server-2003
4个回答
10
投票
可能是这个?

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

注册表项是

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

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

 键下的 Auto 值设置为 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


    


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"=-
    

0
投票
约翰的

答案更新:

取自 MSDocs 参考:

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

要删除的注册表项是

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
如果运行托管代码,还可以这样:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\DbgManagedDebugger
如果在 64 位机器上运行 32 位代码,这也是:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger
    
© www.soinside.com 2019 - 2024. All rights reserved.