10

我有一个应用程序托管了一些不稳定的第三方代码,我无法在外部进程中控制这些代码,以保护我的主应用程序免受它出现的严重错误的影响。我的父进程正在监视另一个进程并在它失败时做“正确的事情(tm)”。

我遇到的问题是,Watson 博士仍在检测隔离进程中的崩溃,并在下行过程中附加到进程以进行崩溃转储。这有两个问题: 1. 大大减慢了我检测故障所需的时间,因为在进行故障转储时进程保持活动状态。2. 向用户显示烦人的弹出窗口,询问他们是否要将错误报告提交给 Microsoft。

显然,我更愿意修复子进程中的错误,但鉴于这不是一个选项,我希望能够有选择地禁用该进程的 Dr. Watson(以及 Vista+ 中的 Windows 错误报告)。

在移交给不受信任的位之前,我在进程中运行了一些我自己的代码,所以如果有一个我可以调用的 API 会影响当前进程,那很好。

我知道: http: //support.microsoft.com/default.aspx/kb/188296这将禁用整个机器的 Watson 博士。我不想这样做,因为它会让我成为一个坏公民,破坏机器范围的设置。

我也知道 Vista+ 中的 WerSetFlags 选项似乎会禁用当前进程的 Windows 错误报告,但我需要一些能够在早期操作系统版本上禁用 Dr.Watson 的东西。

4

2 回答 2

3

当一个进程没有处理某个异常时,就会调用好医生。因此,常见的方法是自己处理所有异常。在您的情况下,这要困难得多,因为您不拥有崩溃的进程代码。然后,您可以做的是在运行时将您的代码注入其他进程,并安装一个异常处理程序,该处理程序将吞下导致崩溃的异常。当被捕获时,优雅地关闭进程。

这里有很多关于将代码注入另一个进程的问题。至于崩溃处理程序,您可以设置未处理的异常过滤器,也可以添加向量异常处理程序。请注意,对于后者,您必须小心不要吞下实际上在另一个进程中处理的合法异常,即找到一种方法来识别崩溃异常并确保它是您唯一处理的异常。

于 2009-07-16T05:17:26.887 回答
2

您想禁用 GPF 弹出窗口:http: //blogs.msdn.com/oldnewthing/archive/2004/07/27/198410.aspx

于 2009-07-15T22:05:00.423 回答