web-dev-qa-db-ja.com

Pythonセグメンテーションフォールトをデバッグするには?

Pythonセグメンテーションフォールトをデバッグするにはどうすればよいですか?

SuSE 12.3でpythonコードを実行しようとしています。再現可能なセグメンテーションフォールトが発生します。pythonコードはセグメンテーションフォールトのない他のプラットフォームで動作します年。

Pythonのみをコーディングし、C拡張機能はありません....

これをデバッグする最良の方法は何ですか?私は少しANSI Cを知っていますが、それは10年前でした....

Python 2.7.5

更新

セグメンテーション違反は、インタープリターのシャットダウン時に発生します。

スクリプトを数回実行できます。

python -m pdb myscript.py arg1 arg1
continue
run
continue
run

しかし、ctrl-dを使用してpdbを離れると、セグメンテーションエラーが発生します。

更新2

私は今gdbでそれをデバッグしようとしています:

gdb 
> file python
> run myscript.py arg1 arg2
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7fffefbe2700 (LWP 15483)]
0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
(gdb) bt
#0  0x00007ffff7aef93c in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#1  0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#2  0x00007ffff7adc858 in ?? () from /usr/lib64/libpython2.7.so.1.0
#3  0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#4  0x00007ffff7af1082 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#5  0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#6  0x00007ffff7af233d in PyEval_EvalFrameEx () from /usr/lib64/libpython2.7.so.1.0
#7  0x00007ffff7af5303 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.7.so.1.0
#8  0x00007ffff7adc5b6 in ?? () from /usr/lib64/libpython2.7.so.1.0
#9  0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#10 0x00007ffff7ad9171 in ?? () from /usr/lib64/libpython2.7.so.1.0
#11 0x00007ffff7ad840d in PyObject_Call () from /usr/lib64/libpython2.7.so.1.0
#12 0x00007ffff7aeeb62 in PyEval_CallObjectWithKeywords () from /usr/lib64/libpython2.7.so.1.0
#13 0x00007ffff7acc757 in ?? () from /usr/lib64/libpython2.7.so.1.0
#14 0x00007ffff7828e0f in start_thread () from /lib64/libpthread.so.0
#15 0x00007ffff755c7dd in clone () from /lib64/libc.so.6

アップデート3

Gdbinitを http://hg.python.org/cpython/file/default/Misc/gdbinit からインストールし、デバッグシンボルを http://download.opensuse.org/debugからインストールしました/distribution/12.3/repo/oss/suse/x86_64/

(gdb) pystack
No symbol "_PyUnicode_AsString" in current context.

今何?

Update 4新しいRPM(python-2.7.5-3.1.x86_64)をインストールしました。セグメンテーション違反は減りますが、それでも起こります。リポジトリへのリンクは次のとおりです。

http://download.opensuse.org/repositories/devel:/languages:/python:/Factory/openSUSE_12.3/x86_64/

Update 5最初の問題を解決しました:

http://bugs.python.org/issue1856 (シャットダウン(終了)は、デーモンスレッドの実行中にハングまたはセグメンテーション違反になる可能性がありました)

関連: デーモンスレッドでのインタープリターシャットダウンの検出

39
guettli

デーモンスレッドが実行されている可能性がありますか?再現可能なバグがあります。これは3.xでのみ修正され、2.xでは修正されていません。

http://bugs.python.org/issue1856

shutdown (exit) can hang or segfault with daemon threads running

これは私自身の質問に対する答えです。問題の根本を見つけるのに時間がかかりました。

次の質問は次のとおりです。このバグをどのようにコーディングするか: デーモンスレッドでインタープリターのシャットダウンを検出する

7
guettli

私はSegmentation faultが、終了時ではなく、一般的には、 faulthandler ほど効果的に役立つものは他にないことがわかりました。 Python 3.3の一部であり、pipを使用して2.7にインストールできます。

28
mariotomo

Pythonコード(インポートされたサードパーティモジュールを使用する場合でも)以外のコードを実行しない場合、セグメンテーション違反はおそらくインタープリターまたはその組み込みCモジュールの1つにバグがあることを意味します。

CPythonをビルドして自分でデバッグしてみてください 、またはクラッシュを再現する最小のスクリプトを作成してみてください 問題を報告する

5
icecrime