我正在一个图书馆工作,我将各种任务交给一些第三方图书馆,这些图书馆做一些相对粗略或危险的特定于平台的工作。(具体来说,我正在编写一个数学函数解析器,它调用 JIT 编译器,如 LLVM 或 libjit,以构建机器代码。)在实践中,这些第三方库有崩溃的趋势(部分原因是我的错,当然,但我仍然想要一些保险)。
那么,我希望能够非常优雅地处理一项可怕的工作——SIGSEGV、SIGILL 等——而不会降低我的其余代码(或调用我的库函数的用户的代码)。需要明确的是,我不关心该特定工作是否可以继续(我不会尝试修复崩溃条件),我也不真正关心此类崩溃后对象的状态(我会丢弃如果发生崩溃,请立即使用它们)。我只想能够检测到发生了崩溃,阻止崩溃退出整个进程,停止调用任何崩溃的内容,并恢复执行。
(对于更多的上下文,目前的代码是一个 for 循环,测试每个可用的 JIT 编译器。其中一些编译器可能会崩溃。如果他们这样做,我只想执行continue;
并继续测试另一个编译器。 )
目前,我有一个signal()
基于 - 的实现非常可怕地失败了;当然,longjmp()
超出信号处理程序是未定义的行为,并且信号处理程序几乎预计会以exit()
or结尾terminate()
。只是将代码扔到另一个线程中本身并没有帮助,至少到目前为止我已经测试过它的方式。我也无法破解使用 C++ 异常来完成这项工作的方法。
那么,将一组特定指令/线程/作业与崩溃隔离的最佳方法是什么?