我想知道是否可以通过dlopen和朋友沙箱动态链接的库。目的是从库中的错误中恢复而不会拆掉整个应用程序,例如SEGFAULT等。
任何人都有过这方面的经验吗?
答案 0 :(得分:4)
您可以在调用库之前fork(),然后将结果传递给您的母进程。让母进程等待来自子进程的数据,如果崩溃则报告错误。
答案 1 :(得分:1)
一般来说,异常处理是高度依赖操作系统的。我将做一些假设,并尝试提供一些通用指导。请注意,这绝不是一个详尽的回复,但应该作为一个起点。
我会假设:
在大多数情况下,您对保护内存泄漏感兴趣。
你对Windows(这是整个其他的蜡球)不感兴趣,因为你提到了dlopen(否则你会说LoadLibrary)
您了解链接C ++符号的细微差别。如果您未在mini howto on dlopen c++
一般来说
对于所描述的问题没有通用的解决方案,如果没有涉及提供数据的专门操作系统和代码段沙箱,有可信系统和专业操作系统内核可以做到这一点,但我假设你想要这样做一个很好的老* 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处理程序返回。