如何在Windows上自动捕获并重新启动崩溃的进程?

3
这可能有点傻。当我的进程崩溃时,会启动一个 WerFault.exe,只有在我关闭此窗口或结束其任务后才能重新获得控制权。
我正在寻找一种简单的方法来防止崩溃程序显示此窗口,或者任何可以让我捕捉这个崩溃的想法。
顺便说一句,SEH没有用。我不确定为什么。即使使用 SEH,崩溃仍然存在。
谢谢!
现在我只是在想办法避免这个 WerFault.exe 窗口和有时出现的 csrss.exe 窗口,并重新获得控制。

不确定这是否仍然准确,但是http://support2.microsoft.com/kb/121434描述了如何分配默认调试器。 - Harry Johnston
@HarryJohnston 我的进程崩溃是正常的。它在一个静态库上运行多个测试。 - Jim Yang
你尝试过使用 SetUnhandledExceptionFilter 吗? - Jonathan Potter
@JimYang:的想法是,自定义调试器可以自动重新启动进程。 - Harry Johnston
请参考以下链接了解如何在Windows服务上设置恢复选项:https://dev59.com/GWw15IYBdhLWcg3w1vWB - wal
2个回答

2

不错的发现(+1),但不确定这对于OP想要的东西会更好,因为当应用程序崩溃时,它会弹出一个“您要重新启动吗?”对话框,这与“您要发送错误报告吗?”一样讨厌。此外,它需要应用程序运行至少60秒,这对于测试程序来说可能很多。 - Damon
看起来不是我想要的。我仍然需要手动关闭“OOPS,我崩溃了:(”窗口并恢复控制。 - Jim Yang

0

我没有尝试过,但是这个API:WerAddExcludedApplication应该可以禁用错误报告:http://msdn.microsoft.com/en-us/library/bb513617%28v=VS.85%29.aspx

至于重新启动您的应用程序,您可以创建另一个后台进程来启动主进程并监视其行为。如果它崩溃了,那么就重新启动它。

[编辑]

不幸的是,这个API可能不起作用,因为评论中建议要想删除此对话框,您需要FindWindow()和SendMessage(... WM_CLOSE...)


你是在建议我创建另一个线程,一遍又一遍地运行 FindWindow(..."WerFault.exe"...) 吗? - Jim Yang
好的,我已经尝试了WerAddExcludedApplication,但是它创建的不是一个“大”的窗口,而是一个微小的窗口:)。它很可爱,但不是我想要的。 - Jim Yang
你可能比FindWindow做得更好;Raymond Chen最近写了许多关于UI自动化的文章,例如:http://blogs.msdn.com/b/oldnewthing/archive/2014/02/17/10500645.aspx - Harry Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接