c++ - 当外部库中的线程意外崩溃我的应用程序时,我该怎么办?

标签 c++ multithreading exception crash

我的应用程序使用相机库,它将连续将图像发送到我的应用程序。不幸的是,这个库启​​动了一个抛出异常(或导致抛出异常)的线程并且不处理它。结果整个应用程序崩溃了。有没有办法防止应用程序崩溃?我可以在外部线程上安装异常处理程序吗?

有关我的具体情况的一些详细信息:崩溃线程的调用堆栈中没有我可以控制的函数。我什至不知道这个线程到底是做什么用的。但是我用调试器停止程序,我可以知道哪个线程将崩溃。不幸的是,线程崩溃非常随机,有时需要一个多小时才会发生问题。我正在使用 Visual Studio C++ 2010,调试器告诉我,这是一个 std::bad_alloc。

最佳答案

我没有处理过 Windows,所以我无法为您提供执行此操作的具体方法,但我认为这里有两个想法适用于任何现代操作系统。

将该库移出您的进程

您可以创建一个“助手”应用程序,它充当“主”应用程序和库之间的桥梁。这样,当“助手”应用程序崩溃或开始出现故障(即使用太多内存等)时,您可以安全地弹起它,而不会影响主应用程序。任何 IPC 方法都可用于在该“助手”和您的主应用程序之间建立通信。

拦截并控制“坏”库的线程

您可以为进程 Hook /拦截/重载系统调用(在类似 POSIX 的操作系统中,执行此操作的方法很少,但最简单的方法是使用 LD_PRELOAD 变量并预加载共享对象与代码。Windows 确实提供了类似的功能,但我不知道它叫什么)。

然后,您可以注入(inject)自己的代码,通过拦截线程创建例程/系统调用(CreateThread?),将第三方库的线程例程包装在 try-catch block 中。

这在技术上是可行的,但我担心的是,在捕获并抑制该异常后,您无法真正判断该库将继续正常运行。所以第一种方法更有可能效果良好。

希望有帮助。

关于c++ - 当外部库中的线程意外崩溃我的应用程序时,我该怎么办?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12076927/

相关文章:

c++ - 如何提高计算的编程技能?

C++ 模板变量赋值困惑

c++ - 模拟 shared_ptr 循环引用

objective-c - UITableViewController 在网络请求完成之前执行延迟功能

ruby-on-rails - 在 Rails 中,有没有办法从 rescue_from 中提取 "short-circuit"?

java - 线程 "main"java.io.FileNotFoundException : 中出现异常

javascript - 用于多线程的 v8 储物柜

java - 每个线程上有多个任务的执行器服务

c++ - 通知另一个线程数据可用的最快方法是什么?除了纺纱还有其他选择吗?

c++ - reinterpret_cast 本身会导致异常吗?