9

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

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

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

我大约在2年前做过这件事,但就我个人而言,我记不住文章或所需的注册表路径。

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


修复:发现人:John Knoeller

删除以下键

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\AeDebug\调试器HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft
.NET框架\DbgManagedDebugger

2

4个答案4

重置为默认值
10

可能是这样吗?

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

注册表项为

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\调试器HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\。NETFramework\DbgManagedDebugger
2
  • 确切地!!谢谢您!注意:如果您没有安装VS,请向下滚动到注册表路径HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger HKEY_MACHINE\SOFTWARE\Microsoft\。NETFramework\DbgManagedDebugger
    – 布瑞恩
    评论 2010年2月17日20:35
  • 链接已断开,最好提供答案而不仅仅是链接(请参阅meta.stackexchange.com/a/8259). 评论 2020年9月30日23:31
6

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

弗斯特,可以使用Windows API函数设置错误模式和/或设置线程错误模式。可以从中取消预订。NET应用程序。

PInvoke的相关签名为:

公共枚举错误模式:uint{SEM_DEFAULT=0x0000,SEM_FAILCRITICALERRORS=0x0001,SEM_NOGPFAULTERRORBOX=0x0002,SEM_NOALIGNMENTFAULTEXCEPT=0x0004,SEM_NOOPENFILEERRORBOX=0x8000}[DllImport(“Kernel32.dll”)]公共静态外部错误模式设置错误模式(错误模式)//自XP以来可用[DllImport(“Kernel32.dll”)]公共静态外部错误模式GetErrorMode()//自Vista起可用[DllImport(“kernel32.dll”,SetLastError=true)]公共静态外部bool SetThreadErrorMode(ErrorMode-newMode,out-ErrorMode-oldMode)//自Windows 7起可用[DllImport(“Kernel32.dll”)]公共静态外部错误模式GetThreadErrorMode()//自Windows 7起可用


第二,自Vista以来,有一种更具体的基于注册表的解决方案:
仅排除此应用程序的调试。请参见:

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

复印件:

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

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

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

默认AeDebug注册表项可以表示为:
HKEY_LOCAL_MACHINE(香港本地机器)软件微软Windows NT(Windows NT)当前版本Ae调试自动=1自动排除列表DWM.exe=1

1
  • +1,要求在程序正在运行的每台机器上更改注册表项将是令人沮丧的。使用API调用会更好! 评论 2014年11月18日14:38
2

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

Windows注册表编辑器5.00版[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug]“调试器”=-[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]“DbgManagedDebugger”=-
0

约翰的最新消息回答:

摘自MSDocs参考如何:启用/禁用实时调试:

要删除的注册表项是

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

如果运行托管代码,还应执行以下操作:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\。NETFramework\DbgManagedDebugger

如果在64位机器上运行32位代码,这也会:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432节点\Microsoft\Windows NT\CurrentVersion\AeDebug\Debugger

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.