Python 2.7.3 を使用して、Arch Linux にdolfinをインストールして使用しようとしています。
このようなセグメンテーション違反の原因を突き止める最善の方法は何ですか?
$ 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
コマンド間に「print」ステートメントを追加してみましたが、swig によってビルドされたモジュールをロードするこの load_module 行まで問題を追跡しました。
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)
別のバージョンの別のライブラリでビルドされた (またはリンクされている) ライブラリにリンクされている共有ライブラリが原因でセグメンテーション違反が発生する可能性があることを読みましたが、どのライブラリが問題を引き起こしているかを調べるにはどうすればよいですか? ありがとう。
アップデート
ltrace を使用して Python インタープリターを起動すると、動作します (これにより、以前は上記のように segfault が発生していました)。
$ 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
-DCMAKE_BUILD_TYPE=Debug を使用して CMake 経由で構成すると、最適化フラグ '-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)