2013-05-24 32 views
18

Python bölümlendirme hatasının hatalarını nasıl ayırım?Python segmentasyon hatası nasıl hata ayıklanır?

Python kodumuzu SuSE 12.3'te çalıştırmaya çalışıyoruz. Tekrarlanabilir bölümleme hataları var. Python kodu yıllardır segmentasyon hataları olmaksızın diğer platformlarda çalışıyor.

Biz sadece kod Python, hiçbir C uzantısı ....

bu hata ayıklamak için en iyi yolu nedir? Biraz ansi c biliyorum, ama bu .... on yıl önce Python 2.7.5

Güncelleme segmentasyon hatası tercüman kapatma olur

oldu.

Senaryonun birkaç kez çalıştırabilirsiniz: Ben ctrl-d Pdb bırakırsanız

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

Ama segmentasyon hatası gibi olur.

Şimdi gdb ile hata ayıklamaya çalıştığınızda 2

Güncelleme: http://download.opensuse.org/debug/distribution/12.3/repo/oss/suse/x86_64/

den

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 

Güncelleme 3

ben http://hg.python.org/cpython/file/default/Misc/gdbinit gelen gdbinit yüklü ve hata ayıklama sembollerini

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

Şimdi ne var?

Güncelleme 4 Biz yeni bir RPM (python-2.7.5-3.1.x86_64) kurulu. Daha az segfault aldık ama yine de oluyorlar.

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

Güncelleme 5 benim ilk sorun çözüldü: İşte deposuna link

O http://bugs.python.org/issue1856 (kapatma (çıkış) asmak veya arka planını ipler çalışan segfault olabilir)

oldu

İlgili: Detect Interpreter shut down in daemon thread

cevap

6

Belki çalışan bir daemon iş parçacığı var mı? Orada sadece 3.x için sabit bir reproduceable böceği, ama değil 2.x için:

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

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

Bu benim kendi soruya cevap. Sorunun kökü bulmak biraz zaman aldı. Nasıl Bu hata kodu için: Burada

sonraki soru olan ben çünkü Segmentation fault bu soruya var Detect Interpreter shut down in daemon thread

+0

Ayrıca başvurumu kapatırken segfault alıyorum. Bu böcek python 2.7 için nasıl düzeltilir? – Patrick

+0

@Patrick Bkz. Http://stackoverflow.com/a/18099067/633961 – guettli

1

Python Debugger mo kullanabilirsiniz.

python -m pdb myscript.py 

kaynak: http://docs.python.org/2/library/pdb.html Python kodu başka bir şey yürütme ediyorsanız

+2

Bir segfault'un Python kodundan gelebileceğini düşünmüyorum ve bu yüzden pdb'nin herhangi bir yardımı olabilir. – icecrime

+0

Cevabınız için teşekkürler, sorumu güncelledik. Segment arızaları tercümanın kapatılmasıyla gerçekleşir. – guettli

3

(hatta ithal üçüncü parti modüller aracılığıyla), bir segfault muhtemelen anlamına çok tercüman bir hata var ya da ithal pdb tarafından dule yerleşik C modüllerinden biri.

build CPython and try to debug it yourself ya da kazayı yeniden üreten en küçük betiği üretmeye çalışın ve file an issue.

3

değil Çıkışta, sadece genel olarak, ben başka bir şey olarak etkili bir yardımcı bulundu faulthandler. Python 3.3'ün bir parçası ve pip'u kullanarak 2.7'ye yükleyebilirsiniz.

+0

Daha önce faulthandler'ı tanımıyordum. İyi görünüyor. Teşekkür ederim. – guettli