gpt4 book ai didi

c++ - SWIG 包装库中 __cxa_allocate_exception 期间的段错误

转载 作者:IT老高 更新时间:2023-10-28 23:00:49 31 4
gpt4 key购买 nike

在为 Ruby 开发一个 SWIG 封装的 C++ 库时,我们在 C++ 代码内的异常处理过程中遇到了无法解释的崩溃。

我不确定重新创建问题的具体情况,但它首先发生在调用 std::uncaught_exception 期间,然后在一些代码更改后,移至 __cxa_allocate_exception 在异常构造期间。 GDB 和 valgrind 都没有提供任何有关崩溃原因的见解。

我找到了几个类似问题的引用资料,包括:

最重要的主题似乎是多种情况的组合:

  • 一个 C 应用程序链接到多个 C++ 库
  • 编译期间使用了多个版本的 libstdc++
  • 通常使用的第二个 C++ 版本来自 libGL 的纯二进制实现
  • 将库与 C++ 应用程序链接时不会出现此问题,仅与 C 应用程序链接

“解决方案”是显式地将您的库与 libstdc++ 链接,也可能与 libGL 链接,强制链接顺序。

在我的代码尝试了许多组合之后,我发现唯一可行的解​​决方案是 LD_PRELOAD="libGL.so libstdc++.so.6"ruby​​ scriptname 选项。也就是说,编译时链接解决方案都没有任何区别。

我对这个问题的理解是 C++ 运行时没有被正确初始化。通过强制链接顺序,您可以引导初始化过程并且它可以工作。该问题仅发生在调用 C++ 库的 C 应用程序中,因为 C 应用程序本身并没有链接到 libstdc++ 并且没有初始化 C++ 运行时。因为使用 SWIG(或 boost::python)是从 C 应用程序调用 C++ 库的常用方法,所以在研究问题时经常会出现 SWIG。

有没有人能够更深入地了解这个问题?是否有实际的解决方案或仅存在变通方法?

谢谢。

最佳答案

根据 Michael Dorgan 的建议,我将我的评论复制到答案中:

找到问题的真正原因。希望这将帮助其他遇到此错误的人。您可能在某处有一些未正确初始化的静态数据。我们做到了,解决方案在我们代码库的 boost-log 中。 https://sourceforge.net/projects/boost-log/forums/forum/710022/topic/3706109 .真正的问题是延迟加载库(加上静态),而不是来自不同库的潜在多个 C++ 版本。欲了解更多信息:http://parashift.com/c++-faq-lite/ctors.html#faq-10.13

自从遇到此问题及其解决方案后,我了解到了解静态和动态链接库之间如何共享或不共享静态数据非常重要。在 Windows 上,这需要显式导出共享静态的符号(包括旨在跨不同库访问的单例)。每个主要平台之间的行为略有不同。

关于c++ - SWIG 包装库中 __cxa_allocate_exception 期间的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2778193/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com