2013-05-24 4 views
18

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

Nous essayons d'exécuter notre code python sur SuSE 12.3. Nous obtenons des fautes de segmentation reproductibles. Le code python a fonctionné sur d'autres plateformes sans failles de segmentation, pendant des années.

Nous ne Python de code, pas d'extension C ....

Quelle est la meilleure façon de débugger? Je connais un peu ansi c, mais c'était il y a dix ans ....

Python 2.7.5

Mise à jour

Le défaut de segmentation se produit lors de 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 erreurs de segmentation se produisent, si je laisse le pdb avec ctrl-d.

Mise à jour 2

Je vais maintenant essayer de 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 de http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/

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

Que faire?

Mise à jour 4 Nous avons installé un nouveau RPM (python-2.7.5-3.1.x86_64). Nous obtenons moins de segavages, mais ils arrivent toujours. Voici le lien vers 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 était http://bugs.python.org/issue1856 (arrêt (sortie) peut se bloquer ou segfault avec des fils de démon en cours d'exécution)

En relation: Detect Interpreter shut down in daemon thread

Répondre

6

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

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

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

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

Voici la question suivante: Comment coder autour de ce bug: Detect Interpreter shut down in daemon thread

+0

Je reçois également un message de segfault à la fermeture de ma demande. Comment corriger ce bug pour python 2.7? – Patrick

+0

@Patrick Voir http://stackoverflow.com/a/18099067/633961 – guettli

1

Vous pouvez utiliser le débogueur Python mo Dule par pdb importation:

python -m pdb myscript.py 

source: http://docs.python.org/2/library/pdb.html

+2

Je ne pense pas qu'un segfault puisse provenir du code Python, et donc 'pdb' pourrait être utile. – icecrime

+0

Merci pour la réponse, j'ai mis à jour la question. Les erreurs de segment se produisent à l'arrêt de l'interpréteur. – guettli

3

Si vous exécuter rien mais le code Python (même à travers vos modules tiers importés), qu'un segfault signifie probablement qu'il ya un bug dans l'interpréteur ou un de ses modules C intégrés.

Vous pouvez soit build CPython and try to debug it yourself, soit essayer de produire le plus petit script qui reproduit le plantage et file an issue.

3

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

+0

Je ne connaissais pas faulthandler avant. Cela semble bon. Je vous remercie. – guettli