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
,但遇到了同样的问题。如果有帮助,我会继续:
【问题讨论】:
【参考方案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 给出分段错误
C++ 11 Boost 1.65 recursive_directory_iterator 给出分段错误错误