C++ Linux上来自共享对象(.so)的异常
我有一个叫做ftest的测试程序。它加载包含测试的.so文件,并运行在其中找到的测试。其中一个测试加载并运行一个.so,其中包含用于O/RM的Postgres数据库驱动程序 当Postgres驱动程序抛出该.so文件中定义的异常(或它链接到的文件,但ftest未链接到的文件)并被测试框架捕获时,异常析构函数将触发segfault 每当编译的异常位于已动态加载(使用dload)的.so中时,就会发生此segfault 在具有相同体系结构的Windows中,这种方法可以很好地工作。我们真的不想限制自己只使用来自核心库的异常——外接程序应该可以自由创建自己的异常类并正常处理它们 异常是std::exception的子类。有时,异常可能在库(如libpqxx)中定义,这意味着异常有时也不受我们的控制 使用以下方法引发异常:C++ Linux上来自共享对象(.so)的异常,c++,linux,exception,g++,shared-objects,C++,Linux,Exception,G++,Shared Objects,我有一个叫做ftest的测试程序。它加载包含测试的.so文件,并运行在其中找到的测试。其中一个测试加载并运行一个.so,其中包含用于O/RM的Postgres数据库驱动程序 当Postgres驱动程序抛出该.so文件中定义的异常(或它链接到的文件,但ftest未链接到的文件)并被测试框架捕获时,异常析构函数将触发segfault 每当编译的异常位于已动态加载(使用dload)的.so中时,就会发生此segfault 在具有相同体系结构的Windows中,这种方法可以很好地工作。我们真的不想限制自
throw exception_class( exception_arguments );
并被发现使用:
catch ( std::exception &e ) {
// handler code
}
是否需要一些特殊的编译器选项来实现此功能?我们是否需要通过
抛出新异常\u类(args)
(我们真的不想这么做)?假设您使用gcc-
在生成调用dlload()的可执行文件时追加-Wl,-E。这将从可执行文件导出所有类型信息符号,这将允许RTTI(捕获异常时)正常工作
VC++使用字符串比较来匹配typeinfo,结果是动态转换速度较慢,但二进制文件较小。g++使用指针比较
我在尝试使用在运行时加载的.so中实现的纯虚拟接口类时遇到了相同的问题
网上也有一些关于这个主题的文章
希望有帮助,
海曼。问题出在析构函数上,而不是捕获物。如果它是虚拟表的位置,我也不会感到惊讶——可能是.so没有在表加载到的页面上授予读取权限,因此析构函数无法读取。不过这纯粹是猜测。我会看看能否通过Boost.Build设置这些选项。-Wl,E似乎没有任何区别:(事实上,我认为-Wl,E确实有影响——还有第二个问题,异常也会导致。因此,在异常完成之前卸载。修复这两个问题意味着我们现在可以让异常在没有segfaults的情况下工作。耶!