[Gelistirici] Comar segmentation fault problemi

Ozan Çağlayan ozan at pardus.org.tr
28 Ağu 2009 Cum 19:17:26 EEST


Merhaba,

Özellikle son günlerde kullanıcı listesi, eş dost ve bugzilla
aracılığıyla bildirilen, paket yöneticisi aracılığıyla güncelleme
yaparken D-Bus'tan yanıt alamama hatası geldiğine dair bir sorun var.
Biz genelde pisi kullandığımız için bu tarz sorunları çok yaşamıyoruz.
Ancak Onur tekrar edebilmiş hatayı. Akabinde biraz zorlayarak ben de bir
kere tekrar ettim, Onur'un test ortamında da 5-6 dakika süren bir
senaryoya tekrar edilebiliyor:

- Paket yöneticisini aç
- Tüm güncellemeleri seç, güncelle

Bu esnada 112MB civarı güncelleme indiriliyor (50'nin üzerinde paket).
İndirme işlemi tamamlanmadan ise işlem durup D-Bus'tan yanıt alınamıyor
diye hata veriyor.

Bu sorun, sürüm çıkmadan önce aslında timeout sorunu olarak da yaşanmış
(Faik bant genişliğini 1kb'a indirerek tekrar edebiliyordu) ve ilgili
yerde çözülmüştü. Ancak mevcut durumda dmesg'e Comar'ın segfault
verdiğine dair bir mesaj düşüyor yani *doğrudan* bir timeout sorunu
değil, sanırsam comar gittiği için ortaya çıkan bir timeout sorunu.

Core dump alarak[0] sorunun yerini tespit ettik. Önce backtrace:

#0  0xb7e68d5b in visit_decref (op=0x9e2ff98, data=0x0) at
Modules/gcmodule.c:271
#1  0xb7df6971 in tupletraverse (o=0xa9b046c, visit=0xb7e68d50
<visit_decref>, arg=0x0) at Objects/tupleobject.c:512
#2  0xb7e696e0 in subtract_refs (containers=<value optimized out>) at
Modules/gcmodule.c:296
#3  collect (containers=<value optimized out>) at Modules/gcmodule.c:817
#4  0xb7e6a03f in PyGC_Collect () at Modules/gcmodule.c:1292
#5  0xb7e5b631 in Py_Finalize () at Python/pythonrun.c:424
#6  0x08051d48 in handle_message (msg=0x9c7a450) at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/loop.c:150
#7  0x08052b8b in proc_fork (child_func=0x8051b72 <handle_message>,
msg=0x9c7a450) at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/process.c:156
#8  0x0805210b in filter_func (conn=0x9c66fb8, bus_msg=0x9c7a450,
data=0x0) at /var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/loop.c:219
#9  0xb7d51721 in dbus_connection_dispatch (connection=0x9c66fb8) at
dbus-connection.c:4406
#10 0x0805230a in fd_handler (events=1, watch=0x9c66c78) at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/loop.c:289
#11 0x0805273f in loop_exec () at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/loop.c:417
#12 0x0804c5b4 in main (argc=8, argv=0x63746566) at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/main.c:85

Şimdi Py_Finalize()'ın içinde patlıyor Comar. Py_Finalize() ise tüm
Comar kodunda sadece 1 kere çağırılıyor o da handle_message()'da:

(gdb) frame 6
#6  0x08051d48 in handle_message (msg=0x9c7a450) at
/var/pisi/comar-2.9.7-97/work/comar-2.9.7/src/loop.c:150
150         Py_Finalize();
(gdb) list
145         }
146         else {
147             bus_reply_unknown_method(msg);
148         }
149
150         Py_Finalize(); <----
151     }
152
153     void
154     handle_core_message(DBusMessage *bus_msg, const char *path,
const char *iface, const char *method, const char *sender, PyObject
*py_args)


Araştırmalar sonucunda Fatih Py_Finalize()'ın child process içinden
çağırılmaması gerektiğine dair bir şeyler buldu:
https://issues.apache.org/jira/browse/MODPYTHON-109?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel

Comar'da da (yukarda 7. frame'de gördüğünüz gibi)
proc_func(handle_message) çağrısı var yani handle_message child
process'te çalıştırılıyor.

- Finalize()'ı kaldırdık yemedi
- handle_message()'dan daha granüler olsun diye message_execute()'un
içine taşıdık yine düzelme olmadı.
- 2008 Comar'ına baktık benzer bir yapı ve benzer bir yerde yine child
process içinde aynı init ve finalize çağrıları mevcut.

Bir de son olarak Py_Finalize()'dan önce iki adet free() var. Acaba
onlar Py_Finalize()'dan sonra mı deallocate edilmeli diye bir şey geldi
aklımıza ancak deneyemedik vakit yoktu.

Core dump (9.5mb kendisi) aşağıda, daha detayı incelemek isteyenler,
ilgili debug paketlerini yükleyip, comar ve python'un inşa dosyalarını
unpack edip,

gdb /usr/sbin/comar
core corefile

diyerek backtrace'e ulaşabilirler.

iyi haftasonları
Ozan,

[0]: http://cekirdek.pardus.org.tr/~ozan/ivir/core.bz2



Gelistirici mesaj listesiyle ilgili daha fazla bilgi