我有一个应用程序托管一些不稳定的第三方代码,我无法在外部进程中控制这些代码,以保护我的主应用程序免受其出现的严重错误的影响。我的父进程正在监视其他进程,并在失败时执行“正确的事情(tm)”。
我遇到的问题是 Dr. Watson 仍在检测隔离进程中的崩溃,并附加到进程中以进行故障转储。这有两个问题:
1. 大大减慢了我检测故障所需的时间,因为在进行故障转储时进程保持活动状态。
2. 向用户显示烦人的弹出窗口,询问他们是否要将错误报告提交给 Microsoft。
显然,我更愿意修复子进程中的错误,但考虑到它不是一个选项,我希望能够有选择地禁用该进程的 Dr. Watson(以及 Vista+ 中的 Windows 错误报告)。
在移交给不受信任的位之前,我正在进程中运行一些我自己的代码,因此,如果有一个我可以调用的 API 会影响当前进程,那就没问题了。
我知道:http://support.microsoft.com/default.aspx/kb/188296 http://support.microsoft.com/default.aspx/kb/188296这将禁用 Dr. Watson 的整个机器。我不想这样做,因为破坏机器范围的设置会让我成为一个坏公民。
我还知道 Vista+ 中的 WerSetFlags 选项似乎会禁用当前进程的 Windows 错误报告,但我需要一些可以在早期操作系统版本上禁用 Dr.Watson 的选项。
当进程不处理某个异常时,就会调用好医生。因此,常见的方法是自己处理所有异常。就您而言,这要困难得多,因为您不拥有崩溃的流程代码。然后,您可以做的就是在运行时将代码注入到其他进程中,并安装一个异常处理程序,该处理程序将吞掉导致崩溃的异常。当被发现时,优雅地关闭进程。
这里有很多问题讨论将代码注入另一个进程。至于崩溃处理程序,您可以设置未处理的异常过滤器 http://msdn.microsoft.com/en-us/library/ms680634(VS.85).aspx, or 添加向量异常处理程序 http://msdn.microsoft.com/en-us/library/ms679274(VS.85).aspx。请注意,对于后者,您必须小心,不要吞下实际上在其他进程内处理的合法异常,即找到一种方法来识别崩溃异常并确保它是您唯一处理的异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)