1. ホーム
  2. python

[解決済み] Pythonのセグメンテーションフォールトをデバッグするには?

2023-06-09 17:26:34

質問

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.

今度は何?

アップデート4 新しいRPM (python-2.7.5-3.1.x86_64) をインストールしました。セグメンテーションフォールトは少なくなりましたが、まだ起こります。 リポジトリへのリンクはこちらです。

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

アップデート 5 最初の問題を解決しました。

それは http://bugs.python.org/issue1856 (シャットダウン (終了) は、実行中のデーモンスレッドでハングアップしたりセグメンテーションが発生することがあります)

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

どのように解決するのですか?

私がこの質問にたどり着いたのは Segmentation fault が、終了時ではなく、ただ一般的に、他の何も効果的に役立つことがないことがわかりました。 faulthandler . これは Python 3.3 の一部であり、2.7 にインストールするには pip .