cmake - 如何调查 imp.load_module 上的 python2 段错误

标签 cmake shared-libraries swig python-2.x archlinux

我正在尝试安装和使用dolfin在 Arch Linux 上,使用 Python 2.7.3。

找出导致分段的最佳方法是什么 诸如此类的故障?

$ python2 -c "import dolfin; print dolfin.__version__"
[3]    6491 segmentation fault (core dumped)  python2 -c "import dolfin; print 
dolfin.__version__"

我尝试通过 gdb 检查核心文件:

$ sudo systemd-coredumpctl gdb 6491

但它们总是被截断:

Reading symbols from /usr/bin/python2.7...(no debugging symbols
found)...done.
BFD: Warning: /var/tmp/coredump-wSi8DV is truncated: expected
core file size >= 39694336, found: 25165824.
warning: core file may not match specified executable file.
[New LWP 7056]
Cannot access memory at address 0x7fe70be0d148
Cannot access memory at address 0x7fe70be0d140

我尝试在命令之间添加“打印”语句,并且有 跟踪问题到这个 load_module 行,它加载一个 swig 构建的模块:

fp, pathname, description = imp.find_module('_common', [dirname(__file__)])
print "_mod = imp.load_module('_common', \n\tfp=%s, \n\tpathname=%s, \n\tdescription=%s)" % ( fp, pathname, description)
_mod = imp.load_module('_common', fp, pathname, description)

“打印”行打印以下内容,看起来正确:

_mod = imp.load_module('_common', 
        fp=<open file '_common.so', mode 'rb' at 0x282d150>, 
        pathname=_common.so, 
        description=('.so', 'rb', 3))
[1]    9039 segmentation fault (core dumped)  python2 -c "import dolfin; print dolfin.__version__"

我尝试在模块开始时添加 sys.settrace 以获得更多 信息,但这并没有发生。

因此,我检查了它尝试的共享库的链接 负载:

$ ldd _common.so
    libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f52fe960000)
    libavformat.so.54 => /lib64/libavformat.so.54 (0x00007f52fe61d000)
    libavcodec.so.54 => /lib64/libavcodec.so.54 (0x00007f52fd6bb000)
    libavutil.so.51 => /lib64/libavutil.so.51 (0x00007f52fd48d000)
    libswscale.so.2 => /lib64/libswscale.so.2 (0x00007f52fd240000)
    libvtkImaging.so.5.10 => /usr/lib/vtk-5.10/libvtkImaging.so.5.10 (0x00007f52fcb6e000)
    libvtkftgl.so.5.10 => /usr/lib/vtk-5.10/libvtkftgl.so.5.10 (0x00007f52fc960000)
    libfreetype.so.6 => /lib64/libfreetype.so.6 (0x00007f52fc6c1000)
    libQtGui.so.4 => /lib64/libQtGui.so.4 (0x00007f52fba1d000)
    libQtCore.so.4 => /lib64/libQtCore.so.4 (0x00007f52fb546000)
    libGL.so.1 => /lib64/libGL.so.1 (0x00007f52fb223000)
    libXt.so.6 => /lib64/libXt.so.6 (0x00007f52fafbc000)
    libvtkParallel.so.5.10 => /usr/lib/vtk-5.10/libvtkParallel.so.5.10 (0x00007f52faabd000)
    libvtkexoIIc.so.5.10 => /usr/lib/vtk-5.10/libvtkexoIIc.so.5.10 (0x00007f52fa877000)
    libvtkVolumeRendering.so.5.10 => /usr/lib/vtk-5.10/libvtkVolumeRendering.so.5.10 (0x00007f52f9fdf000)
    libQtWebKit.so.4 => /lib64/libQtWebKit.so.4 (0x00007f52f81f9000)
    libQtSql.so.4 => /lib64/libQtSql.so.4 (0x00007f52f7fb9000)
    libQtNetwork.so.4 => /lib64/libQtNetwork.so.4 (0x00007f52f7c81000)
    libvtkViews.so.5.10 => /usr/lib/vtk-5.10/libvtkViews.so.5.10 (0x00007f52f7993000)
    libvtkInfovis.so.5.10 => /usr/lib/vtk-5.10/libvtkInfovis.so.5.10 (0x00007f52f7357000)
    libpci.so.3 => /usr/lib/libpci.so.3 (0x00007f52f714b000)
    libxcb.so.1 => /usr/lib/libxcb.so.1 (0x00007f52f6f2b000)
    libcblas.so => /usr/lib/libcblas.so (0x00007f52f6d0a000)
    libssl.so.1.0.0 => /lib64/libssl.so.1.0.0 (0x00007f52f6a9f000)
    libcrypto.so.1.0.0 => /lib64/libcrypto.so.1.0.0 (0x00007f52f6696000)
    libhdf5_hl.so.7.4.0 => /lib64/libhdf5_hl.so.7.4.0 (0x00007f52f6465000)
    librtmp.so.0 => /lib64/librtmp.so.0 (0x00007f52f6249000)
    libva.so.1 => /lib64/libva.so.1 (0x00007f52f6031000)
    libxvidcore.so.4 => /lib64/libxvidcore.so.4 (0x00007f52f5d19000)
    libx264.so.128 => /lib64/libx264.so.128 (0x00007f52f59ca000)
    libvpx.so.1 => /lib64/libvpx.so.1 (0x00007f52f5729000)
    libvorbisenc.so.2 => /lib64/libvorbisenc.so.2 (0x00007f52f525a000)
    libvorbis.so.0 => /lib64/libvorbis.so.0 (0x00007f52f502d000)
    libtheoraenc.so.1 => /lib64/libtheoraenc.so.1 (0x00007f52f4def000)
    libtheoradec.so.1 => /lib64/libtheoradec.so.1 (0x00007f52f4bd4000)
    libspeex.so.1 => /lib64/libspeex.so.1 (0x00007f52f49bb000)
    libschroedinger-1.0.so.0 => /lib64/libschroedinger-1.0.so.0 (0x00007f52f46ef000)
    libopenjpeg.so.1 => /lib64/libopenjpeg.so.1 (0x00007f52f44c7000)
    libopencore-amrwb.so.0 => /lib64/libopencore-amrwb.so.0 (0x00007f52f42b3000)
    libopencore-amrnb.so.0 => /lib64/libopencore-amrnb.so.0 (0x00007f52f4088000)
    libmp3lame.so.0 => /lib64/libmp3lame.so.0 (0x00007f52f3e11000)
    libgsm.so.1 => /lib64/libgsm.so.1 (0x00007f52f3c06000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f52f390f000)
    libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f52f36c1000)
    libSM.so.6 => /lib64/libSM.so.6 (0x00007f52f34b9000)
    libICE.so.6 => /lib64/libICE.so.6 (0x00007f52f329c000)
    libXrender.so.1 => /lib64/libXrender.so.1 (0x00007f52f3091000)
    libfontconfig.so.1 => /lib64/libfontconfig.so.1 (0x00007f52f2e57000)
    libXext.so.6 => /lib64/libXext.so.6 (0x00007f52f2c43000)
    libnvidia-tls.so.310.19 => /lib64/libnvidia-tls.so.310.19 (0x00007f52f2a40000)
    libnvidia-glcore.so.310.19 => /lib64/libnvidia-glcore.so.310.19 (0x00007f52f054d000)
    libVPIC.so.5.10 => /usr/lib/vtk-5.10/libVPIC.so.5.10 (0x00007f52f0328000)
    libCosmo.so.5.10 => /usr/lib/vtk-5.10/libCosmo.so.5.10 (0x00007f52f00e0000)
    libsqlite3.so.0 => /lib64/libsqlite3.so.0 (0x00007f52efe33000)
    libgstapp-0.10.so.0 => /lib64/libgstapp-0.10.so.0 (0x00007f52efc27000)
    libgstinterfaces-0.10.so.0 => /lib64/libgstinterfaces-0.10.so.0 (0x00007f52efa14000)
    libgstpbutils-0.10.so.0 => /lib64/libgstpbutils-0.10.so.0 (0x00007f52ef7f0000)
    libgstvideo-0.10.so.0 => /lib64/libgstvideo-0.10.so.0 (0x00007f52ef5d4000)
    libgstbase-0.10.so.0 => /lib64/libgstbase-0.10.so.0 (0x00007f52ef37f000)
    libgstreamer-0.10.so.0 => /lib64/libgstreamer-0.10.so.0 (0x00007f52ef096000)
    libvtkalglib.so.5.10 => /usr/lib/vtk-5.10/libvtkalglib.so.5.10 (0x00007f52eee75000)
    libresolv.so.2 => /usr/lib/libresolv.so.2 (0x00007f52eec5e000)
    libXau.so.6 => /usr/lib/libXau.so.6 (0x00007f52eea5a000)
    libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0x00007f52ee853000)
    libogg.so.0 => /lib64/libogg.so.0 (0x00007f52ee64d000)
    liborc-0.4.so.0 => /lib64/liborc-0.4.so.0 (0x00007f52ee3d1000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f52ee16e000)
    libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f52edf6b000)
    libffi.so.6 => /lib64/libffi.so.6 (0x00007f52edd63000)
    libuuid.so.1 => /lib64/libuuid.so.1 (0x00007f52edb5e000)
    libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f52ed959000)

我了解到段错误可能是由共享库引起的 与使用(或链接?)a 构建的库链接 另一个库的不同版本,但我如何找出哪个版本 造成麻烦?谢谢。

更新

如果我使用 ltrace 启动 Python 解释器,那么它就会工作(这之前会导致如上所述的段错误):

$ ltrace python2
__libc_start_main(0x400710, 1, 0x7fff640c6f38, 0x400810 <unfinished ...>
Py_Main(1, 0x7fff640c6f38, 0x7fff640c6f48, 0x400710Python 2.7.3 (default, Dec 12 2012,07:12:24) 
[GCC 4.7.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from dolfin import *
>>>

为什么ltrace运行时没有段错误?

更新2

事实证明,通过 CMake 使用 -DCMAKE_BUILD_TYPE=Debug 进行配置仍然允许将优化标志“-O”传递给 g++。我将尝试使用调试符号(标志“-g”)进行重建,看看效果如何。

更新3

使用 -g 标志进行编译没有区别。

更新4

直接从 gdb 运行不会暴露段错误(大概它使用某种形式的 ltrace,如上所述):

$ gdb --args python2 -c "import dolfin; print dolfin.__version__"
GNU gdb (GDB) 7.5.1
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/bin/python2...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python2 -c import\ dolfin\;\ print\ dolfin.__version__
warning: Could not load shared library symbols for linux-vdso.so.1.
Do you need "set solib-search-path" or "set sysroot"?
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/usr/lib/libthread_db.so.1".
Traceback (most recent call last):
  File "/usr/share/gdb/auto-load/usr/lib/libgobject-2.0.so.0.3400.3-gdb.py", line 9, in <module>
from gobject import register
  File "/usr/share/glib-2.0/gdb/gobject.py", line 3, in <module>
    import gdb.backtrace
ImportError: No module named backtrace
1.0.0+
[Inferior 1 (process 8008) exited normally]
(gdb)

最佳答案

I have tried inspecting the core file through gdb ... but they are always truncated

在实时进程上使用 GDB:

gdb --args python2 -c "import dolfin; print dolfin.__version__"
(gdb) run

关于cmake - 如何调查 imp.load_module 上的 python2 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13962014/

相关文章:

ubuntu - 加载共享库时出错 : libhdf5. so.101:无法打开共享对象文件

windows - Linux 和 Windows 链接器之间的区别

java - 在 Java 中处理 FILE * C 输入参数的 SWIG 配置

c++ - 使用 CMake 创建 Qt qml C++ 插件

c++ - CMake:包含外部 makefile 时的编译速度

c++ - 可选共享库

python - 如何使用 SWIG 在 python 中扩展模板化的 c++ 类以允许 [] 运算符

c++ - 在 Python 的 SWIG 中包装 boost::shared_ptr 的 std::vector

testing - 如果更改了 CMAKE_RUNTIME_OUTPUT_DIRECTORY,则 CMake 无法找到测试

c++ - 如何在 x86_64 上交叉编译 Raspberry Pi 项目? (缺少 *.so 由于路径无效)