我的应用程序使用相机库,它将连续将图像发送到我的应用程序。不幸的是,这个库启动了一个抛出异常(或导致抛出异常)的线程并且不处理它。结果整个应用程序崩溃了。有没有办法防止应用程序崩溃?我可以在外部线程上安装异常处理程序吗?
有关我的具体情况的一些详细信息:崩溃线程的调用堆栈中没有我可以控制的函数。我什至不知道这个线程到底是做什么用的。但是我用调试器停止程序,我可以知道哪个线程将崩溃。不幸的是,线程崩溃非常随机,有时需要一个多小时才会发生问题。我正在使用 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/