2015-09-10 23 views
3

我有一定的.NET应用程序,偶尔用下面的窗口错误之一崩溃:如何监控从一个单独的进程的应用程序崩溃

[application name] has encountered a problem and needs to close. We are sorry for the inconvenience.[application name] has stopped working

我想监视此应用程序从另一个.net进程,防止显示默认的Windows错误报告对话框,并做我自己的错误处理。

有没有一种方法可以检测到其他应用程序崩溃?

我可以预防或隐藏默认错误对话框?


一些背景信息:我要针对崩溃的应用程序代码,并在必要时我可以改变它。但是,崩溃是由第三方非托管程序集引起的,它会覆盖某些内存并使应用程序处于不可恢复的状态。一个简单的try-catch块不足以防止崩溃。这就是为什么我想要监视和处理来自单独过程的错误。

回答

0

如果应用程序写入Windows事件日志,您的其他程序可以检查有错误

0
+0

不,我试过了。这个特定的错误是不可捕获的,并且不会引发这个事件。该应用只是崩溃。 – HugoRune

+0

然后这个https://msdn.microsoft.com/en-us/library/windows/desktop/aa373345(v=vs.85).aspx? – user2527768

+0

也接受回答这个http://stackoverflow.com/questions/78048/best-way-to-detect-an-application-crash-and-restartit问题建议从另一个应用程序启动容易出错的应用程序,并等待崩溃。 – user2527768

0

该对话框是Windows错误报告(WER)的一个功能。

有没有一种方法可以检测到其他应用程序崩溃?

从需要某种心跳消息的服务到启用企业WER服务器的corrupted state exceptions捕获服务都有很多选项。 (下面的链接)

[C]我阻止或隐藏默认错误对话框?

WER configuration documentation有关于从自动对话框中排除进程的信息。

具体的注册表项:

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\ 
     Windows Error Reporting\ExcludedApplications\[Application Name] 

HKCU也有类似的键)

不幸的是,如果它是一个访问冲突,你很好畅饮。到异常完成WER时,整个堆栈都会被烧毁,并且内存已经损坏。

为您的应用程序禁用内置的错误报告,也将阻止自动创建小型转储程序,这可能会有所帮助,如果不是解决直接问题,提供弹药以供说明供应商修复它们的dll。

如果供应商不愿意或无法解决问题,则可以复制Explorer处理外壳扩展的方式,并将该组件托管在单独的进程中。这样,当它崩溃时,它只会破坏另一个进程的内存。你必须编写一个包装来让你与之通信。