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
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
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
.
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 .