2013-05-24 3 views
18

Come è possibile eseguire il debug di un errore di segmentazione Python?Come eseguire il debug di un errore di segmentazione Python?

Stiamo provando a eseguire il nostro codice Python su SuSE 12.3. Otteniamo errori di segmentazione riproducibili. Il codice python ha funzionato su altre piattaforme senza errori di segmentazione, per anni.

Abbiamo solo codice Python, senza estensione C ....

Qual è il modo migliore per eseguire il debug di questo? Conosco un po 'ANSI C, ma che è stato dieci anni fa ....

Python 2.7.5

Aggiornamento

L'errore di segmentazione avviene su arresto interprete.

posso eseguire lo script più volte:

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

Ma i difetti di segmentazione accadere, se lascio il PDB con CTRL-D.

Update 2

io ora cerco di eseguire il debug con 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 

Aggiornamento 3

ho installato gdbinit da http://hg.python.org/cpython/file/default/Misc/gdbinit e simboli di debug da http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/

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

Che ora?

Aggiornamento 4 Abbiamo installato un nuovo RPM (python-2.7.5-3.1.x86_64). Otteniamo meno segfault, ma succedono ancora. ecco il link al repository:

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

Update 5 Ha risolto il problema iniziale:

Era http://bugs.python.org/issue1856 (shutdown (uscita) può appendere o segfault con fili demone in esecuzione)

Correlati: Detect Interpreter shut down in daemon thread

risposta

6

Forse c'è un thread daemon in esecuzione? C'è un bug riproducibile, che è stato fissato solo per 3.x, ma non per 2.x:

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

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

questa è la risposta alla mia domanda. Ci è voluto del tempo per trovare la radice del problema.

Ecco la prossima domanda: come codice a questo problema: Detect Interpreter shut down in daemon thread

+0

Sto anche ottenendo segfault sulla chiusura della mia domanda. Come correggere questo bug per python 2.7? – Patrick

+0

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

1

È possibile utilizzare il Debugger Python Dule da pdb importazione:

python -m pdb myscript.py 

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

+2

Non penso che un segfault possa venire dal codice Python, e quindi 'pdb' potrebbe essere di qualche aiuto. – icecrime

+0

Grazie per la risposta, ho aggiornato la domanda. I difetti dei segmenti si verificano quando l'interprete si spegne. – guettli

3

Se stai eseguendo altro che codice Python (anche attraverso i moduli di terze parti importate), di un segfault probabilmente significa che c'è un bug nel interprete o uno dei suoi moduli C incorporati.

È possibile build CPython and try to debug it yourself oppure provare a produrre lo script più piccolo che riproduce l'arresto e file an issue.

3

ho avuto a questa domanda a causa della Segmentation fault, ma non in uscita, solo in generale, e ho trovato che nient'altro ha aiutato nel modo più efficace come faulthandler. Fa parte di Python 3.3 ed è possibile installare in 2.7 utilizzando pip.

+0

Prima non conoscevo il gestore dei guasti. Sembra buono. Grazie. – guettli