jdehaan和Eric Brown的答案摘要,以及这个问题(另请参阅这个问题):
注意:。这些解决方案也可能影响其他错误报告,例如加载DLL或打开文件失败。
选项1:全局禁用
在整个用户帐户或计算机上全局工作,这既有好处也有缺点。
设置[HKLM|HKCU]\Software\Microsoft\Windows\Windows错误报告\DontShowUI
至1。更多信息:WER设置.
选项2:禁用应用程序
需要修改崩溃程序,文档中描述为最佳实践,不适用于库函数。
呼叫设置错误模式:SetErrorMode(设置错误模式(0)|SEM_NOGPFAULTERRORBOX);
(或与SEM辅助参数
). 更多信息:禁用程序崩溃对话框(解释了奇怪的通话安排)。
选项2a:禁用功能:
需要修改崩溃程序,需要Windows 7/2008 R2(仅限桌面应用程序)或更高版本,在文档中描述为首选设置错误模式
,适用于线程安全库函数。
呼叫并重置设置线程错误模式:
DWORD旧线程错误模式=0;设置线程错误模式(SEM_FAILCRITICALERRORS和旧线程错误模式);…设置线程错误模式(z_OldThreadErrorMode,NULL);
更多信息:没有多少可用的?
选项3:指定处理程序
需要修改崩溃程序。
使用设置UnhandledExceptionFilter
设置您自己的结构化异常处理程序,该异常处理程序只需退出,可能会报告,也可能会尝试清理。
选项4:作为异常捕获
需要修改崩溃程序。对于。仅限NET应用程序。
将所有代码包装到全局try/catch块中。指定处理进程损坏状态异常属性
也可能是安全关键属性
关于捕获异常的方法。更多信息:处理损坏状态异常
注释:这可能无法捕获由托管调试助手; 如果是这样,则还需要在应用程序中禁用这些功能。
选项5:停止报告过程
在整个用户帐户上全局工作,但只在控制的持续时间内工作。
在Windows错误报告进程出现时立即终止该进程:
var-werKiller=新线程(()=>{while(真){foreach(Process.GetProcessesByName(“WerFault”)中的var proc)程序。Kill();线程。睡眠(3000);}});werKiller。IsBackground=真;werKiller。开始();
但这仍然不是完全防弹的,因为控制台应用程序可能会通过不同的错误消息崩溃,而错误消息显然是由名为NtRaiseHard错误
:
![替换文本](https://i.sstatic.net/fBsTI.png)