Boost Python自己的模块抛出分段错误`GlobalError::PushToStack()`

Posted

技术标签:

【中文标题】Boost Python自己的模块抛出分段错误`GlobalError::PushToStack()`【英文标题】:Boost Python own module throws Segmentation Fault `GlobalError::PushToStack()` 【发布时间】:2019-07-16 20:28:05 【问题描述】:

我正在尝试围绕我们为 Python 3.6 提供的现有 C++ 库。我遵循了 Boost Python 的教程:

https://flanusse.net/interfacing-c++-with-python.html https://www.mantidproject.org/Boost_Python_Introduction https://github.com/TNG/boost-python-examples/blob/master/01-HelloWorld/CMakeLists.txt

都是SIGSEV,所以我在gdb下运行命令:

gdb --args python -c 'import MyPyLib'

而实际的输出是:

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff3bb02a9 in GlobalError::PushToStack() () from /usr/lib/x86_64-linux-gnu/libapt-pkg.so.5.0

我尝试从 Github 运行 boost-python-examples,但遇到了同样的问题。如果有帮助,我会继续:

gcc 7.4.0 g++ 7.4.0 python 3.6.8 ibboost-python-dev 1.65.1

【问题讨论】:

【参考方案1】:

我发现了问题,所有例子都用

find_package(Boost REQUIRED COMPONENTS python)

但是如果你注意的话,系统中有两个库:

sudo ldconfig -p | grep "libboost_python*"
        libboost_python3-py36.so.1.65.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1
        libboost_python3-py36.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so
        libboost_python-py27.so.1.65.1 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libboost_python-py27.so.1.65.1
        libboost_python-py27.so (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libboost_python-py27.so

所以我开始怀疑我的模块被链接到 python 2.7 boost-python。 我换了CMakeLists.txt 实际组件:

find_package(Boost REQUIRED COMPONENTS python3)

现在它工作正常。令人惊讶的是,这种不匹配会引发如此神秘的错误。此外,cmake 在使用 python3 时抱怨没有找到或索引标题。

【讨论】:

当我在外部 C 库上添加我的 python 模块的一些依赖项但忘记链接到它时,我遇到了类似的问题(GlobalError::PushToStack 中的相同段错误)。你得到的不是一些丢失的符号错误,而是这个神秘的错误,而且很少有有意义的回溯。 我在使用 Cython 时遇到了类似的问题。任何提示可能是什么问题? @skboro 确保 python 库版本绝对匹配。如果他们不这样做,ABI 会抛出偷偷摸摸的错误。

以上是关于Boost Python自己的模块抛出分段错误`GlobalError::PushToStack()`的主要内容,如果未能解决你的问题,请参考以下文章

PyArray_Check / PyArray_CheckExact 给出分段错误

Swift 在尝试访问分段控制索引时抛出错误

join() 上的 Boost 线程分段错误

C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误

Boost.Asio UDP async_read_from 分段错误

C++ boost线程在实例化两次时导致分段错误