web-dev-qa-db-fra.com

Comment déboguer une erreur de segmentation Python?

Comment puis-je déboguer une erreur de segmentation Python?

Nous essayons d'exécuter notre code python sur SuSE 12.3. Nous obtenons des défauts de segmentation reproductibles. Le code python a fonctionné sur d'autres plates-formes sans défauts de segmentation, par exemple). ans.

Nous ne codons que Python, pas d'extension C ....

Quelle est la meilleure façon de déboguer cela? Je connais un peu l'âge, mais c'était il y a dix ans ...

Python 2.7.5

Mise à jour

L'erreur de segmentation se produit à l'arrêt de l'interpréteur.

Je peux exécuter le script plusieurs fois:

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

Mais les défauts de segmentation se produisent, si je quitte la pdb avec ctrl-d.

Mise à jour 2

J'essaie maintenant de le déboguer avec 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

Mise à jour 3

J'ai installé gdbinit depuis http://hg.python.org/cpython/file/default/Misc/gdbinit et les symboles de débogage depuis http://download.opensuse.org/debug /distribution/12.3/repo/oss/suse/x86_64/

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

Et maintenant?

Mise à jour 4 Nous avons installé un nouveau RPM (python-2.7.5-3.1.x86_64). Nous obtenons moins de défauts de segmentation, mais ils se produisent toujours. Voici le lien vers le référentiel:

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

Mise à jour 5 Résolu mon problème initial:

C'était http://bugs.python.org/issue1856 (l'arrêt (sortie) peut se bloquer ou segfault avec les threads démon en cours d'exécution)

Connexes: Détecter l'interpréteur arrêté dans le thread démon

39
guettli

Peut-être qu'un thread démon est en cours d'exécution? Il existe un bogue reproductible, qui a été corrigé uniquement pour 3.x, mais pas pour 2.x:

http://bugs.python.org/issue1856 :

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

Ceci est la réponse à ma propre question. Il a fallu un certain temps pour trouver la racine du problème.

Voici la question suivante: Comment coder autour de ce bogue: Détecter l'interpréteur arrêté dans le thread démon

7
guettli

Je suis arrivé à cette question à cause du Segmentation fault, mais pas à la sortie, juste en général, et j'ai trouvé que rien d'autre n'a aidé aussi efficacement que faulthandler . Cela fait partie de Python 3.3, et vous pouvez installer en 2.7 en utilisant pip.

28
mariotomo

Si vous n'exécutez que du code Python (même via vos modules tiers importés), un défaut de segmentation signifie probablement qu'il y a un bogue dans l'interpréteur ou l'un de ses modules C intégrés.

Vous pouvez soit construire CPython et essayer de le déboguer vous-même , soit essayer de produire le plus petit script qui reproduit le crash et signaler un problème .

5
icecrime