程序崩溃后如何挂起所有线程?

Posted

技术标签:

【中文标题】程序崩溃后如何挂起所有线程?【英文标题】:How do I suspend all threads after my program crashes? 【发布时间】:2011-04-01 20:27:39 【问题描述】:

我有一个未处理的异常处理程序。它显示了一个漂亮的 GUI,并允许用户发送错误报告。用户甚至可以留下他们的姓名和电话号码等,我们的支持部门会给他们回电。效果很好,看起来不错,让客户不那么生气。理论上,无论如何。

问题是我的应用程序使用后台线程,并且线程似乎并不关心是否在 GUI 线程上引发了异常(这是有道理的),而只是继续他们的工作。如果用户让我的自定义异常处理程序窗口保持打开足够长的时间,最终会导致弹出一个 WER 对话框,使其看起来像是错误处理程序本身崩溃了。

我无权访问异常处理程序范围内的线程对象,因此我无法挂起它们。使线程对象全局可访问也不是解决方案。我现在的解决方法是在我的异常处理程序中使用Globals.Crashed = true; 之类的东西,并让我的线程方法在每次循环迭代时检查该属性。不完美,但可以将伤害降到最低。

有没有人知道一个不那么hacky的方法?我的方法错了吗?我是否必须像 WER 那样启动一个外部程序来暂停主程序并显示错误 UI?

【问题讨论】:

如果这个技巧足够好,我会坚持下去。 【参考方案1】:

如果您有一个未处理的、未知的异常,您可以假设任何事情都发生了,您的程序甚至可能无法完成最简单的事情。考虑例如如果它已经消耗了所有可用内存 - 那么您也将无法发送错误报告,因为它可能需要分配内存。

一个好的方法是编写一个单独的小应用程序来报告错误。该应用程序可以从文件中获取要报告的详细信息。这样你的未知异常处理程序会:

将信息转储到临时目录中的文件中。 以文件名作为参数启动错误报告应用程序。 在失败的进程做一些愚蠢的事情之前终止它。

错误报告应用程序应删除临时文件。

【讨论】:

这听起来是最好的方法。谢谢。【参考方案2】:

您可以在全局 Collection 对象中跟踪所有线程,这样当您的处理程序执行时,它可以简单地遍历该集合对象并中止那里的线程。

【讨论】:

我认为上周左右有一次讨论涉及到这个主题。让我看看能不能找到那个链接……好的,就是:***.com/questions/3480451/time-limiting-a-method-in-c【参考方案3】:

看一下这个问题中的代码Suspend Process in C#,您需要对其进行调整,以免暂停您的 GUI 线程以及您启动的任何非后台线程,但它应该执行把戏。

然而,更好的选择是尝试将错误报告 GUI 作为一个单独的进程启动,将所需的信息传递给它,然后从未处理的异常处理程序中终止原始进程,而不是允许任何东西在潜在的损坏状态。

【讨论】:

以上是关于程序崩溃后如何挂起所有线程?的主要内容,如果未能解决你的问题,请参考以下文章

google tango / opencv android 相机应用程序崩溃/挂起

执行任何 IO/流时 C++ JNI 崩溃/挂起

Windows 10 通用应用程序挂起崩溃并出现死锁

图像浏览程序 - 为啥它在线程化后随机崩溃?

Windows 通用应用程序的 Windows 应用程序认证工具包测试期间崩溃的原因?

如何用一行命令让 Systemd 崩溃