Comment déboguer un Python erreur de segmentation?
Comment puis-je débogage Python erreur de segmentation?
Nous essayons d'exécuter notre code python sur SuSE 12.3. Nous obtenons reproductible segmentation des défauts. Le code python a été de travailler sur d'autres plates-formes sans segmentation des défauts, des années.
Nous n'code Python, n ° C-extension ....
Quelle est la meilleure façon de débogage? Je connais un peu le c ansi, mais c'était il y a dix ans ....
Python 2.7.5
Mise à jour
La faute de segmentation qui se passe sur l'interprète de l'arrêt.
Je peux exécuter le script plusieurs fois:
python -m pdb myscript.py arg1 arg1
continue
run
continue
run
Mais la segmentation des défauts se produisent, si je laisse 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 de http://hg.python.org/cpython/file/default/Misc/gdbinit
et les symboles de débogage à partir de http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/
(gdb) pystack
No symbol "_PyUnicode_AsString" in current context.
Quoi maintenant?
Mise à jour 4
Nous avons installé un nouveau TR /min (python 2.7.5-3.1.x86_64). Nous obtenons moins de segmentation, mais ils se produisent encore.
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:
Il a été http://bugs.python.org/issue1856 (arrêt (sortie) peut se bloquer ou erreur de segmentation avec les fils de démon en cours d'exécution)
Connexes: Détecter Interprète arrêter en fil de démon
Vous devez vous connecter pour publier un commentaire.
J'ai eu à cette question en raison de la
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. C'est une partie de Python 3.3, et vous pouvez l'installer en 2.7 utilisationpip
.Peut-être qu'il est un démon de thread en cours d'exécution? Il y a une traçabilité des bug, qui a été fixée pour le 3.x, mais pas pour les 2.x:
http://bugs.python.org/issue1856:
C'est la réponse à ma propre question. Il a fallu un certain temps pour trouver la racine du problème.
Ici est la question suivante: Comment faire pour contourner ce bug: Détecter Interprète arrêter en fil de démon
Si vous êtes l'exécution de rien, mais le code Python (même par le biais de votre importés modules de tiers), qu'une erreur de segmentation veut probablement dire qu'il y a un bug dans l'interprète ou de l'un de ses builtin des modules en C.
Vous pouvez soit construire Disponible et essayez de déboguer vous-même, ou à essayer de produire le plus petit script qui permet de reproduire le crash et fichier un problème.