Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux上来自共享对象(.so)的异常_C++_Linux_Exception_G++_Shared Objects - Fatal编程技术网

C++ Linux上来自共享对象(.so)的异常

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中,这种方法可以很好地工作。我们真的不想限制自

我有一个叫做ftest的测试程序。它加载包含测试的.so文件,并运行在其中找到的测试。其中一个测试加载并运行一个.so,其中包含用于O/RM的Postgres数据库驱动程序

当Postgres驱动程序抛出该.so文件中定义的异常(或它链接到的文件,但ftest未链接到的文件)并被测试框架捕获时,异常析构函数将触发segfault

每当编译的异常位于已动态加载(使用dload)的.so中时,就会发生此segfault

在具有相同体系结构的Windows中,这种方法可以很好地工作。我们真的不想限制自己只使用来自核心库的异常——外接程序应该可以自由创建自己的异常类并正常处理它们

异常是std::exception的子类。有时,异常可能在库(如libpqxx)中定义,这意味着异常有时也不受我们的控制

使用以下方法引发异常:

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的情况下工作。耶!