【发布时间】:2010-12-16 23:22:59
【问题描述】:
当我使用 dlopen 动态加载库时,我似乎无法捕获该库引发的异常。据我了解,这是因为 dlopen 是一个 C 函数。
是否有另一种动态加载库的方法,可以捕获 GCC 中的库引发的异常?
在 Windows 中,您可以使用 LoadLibrary,但对于 Linux,我只找到 dlopen,但在使用 dlopen 时,我无法捕获异常。
编辑: 我试过 void* handle = dlopen("myLib.so", RTLD_NOW | RTLD_GLOBAL);我仍然无法捕获 myLib.so 引发的异常
编辑 2: 我用自己的命名空间抛出自定义异常。我希望能够在库之外捕获这些异常。 我希望能够在不同的编译器上编译,例如 GCC 3.2 和 GCC 4.1。
在 myLib2.so 我抛出异常,一个例子:
namespace MyNamespace {
void MyClass::function1() throw(Exception1) {
throw Exception1("Error message");
}
}
在 myLib1.so 我想捕捉那个异常:
std::auto_ptr <MyNamespace::MyClass> obj = MyNamespace::getClass();
try {
obj->function1();
} catch (MyNamespace::Exception1& e) {
std::cout << e.what(); //This is not caught for some reason.
}
mylib1.so 动态加载 myLib2.so:
void* handle = dlopen("myLib2.so", RTLDNOW | RTLDGLOBAL);
这适用于 Windows(捕捉我的异常),但我当然不使用 dlopen。
编辑 3:myLib1.so 是动态链接的。
【问题讨论】:
-
也许有不同的编译设置。你能用
objdump -TC mylib2.so | grep Exception1检查objdump -TC mylib1.so | grep Exception1的结果吗? typeinfos 的大小应该相等 -
objdump -TC mylib1.so | grep Exception1 在 objdump -TC mylib2.so 时什么也没给出grep Exception1 给出了一些。
-
这很奇怪,可能是这个问题的根源。也许您有一些链接器选项阻止符号在 mylib1 中全局导出?
-
我构建 mylib1 的标志是:-shared -fPIC -rdynamic -W1,--export-dynamic -W1,-soname,libMyLib.so 我构建 mylib2 的标志是一样的
-
会不会是 mylib1 中的代码没有被执行?您看到什么行为,因为未捕获异常而调用 std::terminate?
标签: c++ gcc dynamic exception-handling