C ++沙盒动态库

时间:2010-07-17 13:23:36

标签: c++ dynamic sandbox dlopen

我想知道是否可以通过dlopen和朋友沙箱动态链接的库。目的是从库中的错误中恢复而不会拆掉整个应用程序,例如SEGFAULT等。

任何人都有过这方面的经验吗?

3 个答案:

答案 0 :(得分:4)

您可以在调用库之前fork(),然后将结果传递给您的母进程。让母进程等待来自子进程的数据,如果崩溃则报告错误。

答案 1 :(得分:1)

一般来说,异常处理是高度依赖操作系统的。我将做一些假设,并尝试提供一些通用指导。请注意,这绝不是一个详尽的回复,但应该作为一个起点。

我会假设:

  1. 在大多数情况下,您对保护内存泄漏感兴趣。

  2. 你对Windows(这是整个其他的蜡球)不感兴趣,因为你提到了dlopen(否则你会说LoadLibrary)

  3. 您了解链接C ++符号的细微差别。如果您未在mini howto on dlopen c++

  4. 上阅读

    一般来说

    对于所描述的问题没有通用的解决方案,如果没有涉及提供数据的专门操作系统和代码段沙箱,有可信系统和专业操作系统内核可以做到这一点,但我假设你想要这样做一个很好的老* nix或windows环境。

    编译器的东西使问题更加复杂(默认情况下你的C ++编译器是否生成弱符号?通常会这样做)这会影响try-catch中异常处理的发生方式。

    引发信号的简单操作系统异常处理(SIGSEGV,SIGFPE等):

    支持 sigaction的POSIX系统 ......

    假设您想要防止内存寻址等常规问题。在调用库之前使用sigaction捕获SIGSEG(以防止.init函数),然后在调用库中的函数之前进行信号检查。考虑使用SA_STACK确保您的处理程序跳转到您可以很好地控制的堆栈,并使用SA_SIGINFO确保您的处理程序获取有关源的信息。

    开始这个的好地方是Signal handling on GNU libc manual

    在C ++下:使用包装器和try-catch来捕获软异常

    尝试{    FOO(); } catch(){    // 做一点事 }

    其中foo是指向dll see c++ dlopen mini-howto for a lot more examples and details on loading classes etc.

    中的函数的弱符号

    如果您有更具体的需求,发布它们,我会看看我是否可以提供更多信息。

    干杯

答案 2 :(得分:0)

您如何将segfault与您的应用程序和相关动态库区分开来?如上所述,创建一个单独的进程以隔离库似乎是最好的方法。

修改

发现了this相关问题,指向CERT advisory建议如果您希望移植,不要从SIGSEGV处理程序返回。