问题: 我需要禁用控制台应用程序的崩溃调试提示。
背景: 我们有一个与第三方同步信息的应用程序,该应用程序由于在一天中的某些时间与第三方的连接问题而崩溃。我们无法访问源代码来正确捕获错误,因此我只需要应用程序失败并重试。我有另一个应用程序可以监视我们的同步工具以确保它正在运行。
当同步应用程序崩溃时,会出现需要用户交互的调试提示。因为它停留在屏幕上,所以应用程序实际上永远不会停止运行。结果是“健康 检查”永远不知道失败。我大约两年前就完成了此操作,但我一生都无法记住这篇文章或所需的注册表路径。
操作系统: Windows 2003 Server 应用程序类型: .NET 3.5 控制台应用程序
修复:发现者:John Knoeller
删除以下键HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\调试器 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
.NETFramework\DbgManagedDebugger
首先,可以使用 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。
默认的 AeDebug 注册表项可以表示如下:
HKEY_LOCAL_MACHINE
SOFTWARE
Microsoft
Windows NT
CurrentVersion
AeDebug
Auto = 1
AutoExclusionList
DWM.exe = 1
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]
"Debugger"=-
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"DbgManagedDebugger"=-
答案更新:
取自 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