Python'da pdb ile debugging

Yazdigimiz kodun beklenenden farkli bir davranis sergilediginde kodun nasil calistigini incelemek istedigimizde kuskusuz debuggerlar en cok isimize yarayan aractirlardir.

Bu yazimda Python ile yazdigimiz kodlari pdb ile nasil debug edebilecegimizi ve pdb komutlarindan bahsedecegim.

Python standart kutuphanesiyle beraber pdb debuggeri kurulu gelir. Debug etmek istediginiz satira import pdb; pdb.set_trace() ile breakpoint koyup kodu calistirdigimizda o satira geldiginde interaktif bir shell acilir ve bu shellden kodumuzu debug edebiliriz.

ipdb

ipdb pdb’nin sundugu butun ozelliklere ek olarak IPython’un sundugu kod tamamlama, kod renklendirme, magic fonksiyonlar gibi bircok ek ozellik sunar.

ipdb’yi pip install ipdb komutuyla kurabilirsiniz. pdb yerine ipdb ile kodu debug etmek icin pdb yerine ipdbyi import etmemiz yeterlidir:

import ipdb; ipdb.set_trace()

pdb/ipdb komutlari

> n(ext)

Bir sonraki satira kadar kodu calistirir. Birdefa next calistirildiktan sonra enter tusuna her bastigimizda otomatikmen bir sonraki satira kadar isletir.

> c(ont(inue))

Bir sonraki breakpointe kadar calistirir.

> s(tep)

Cagrilan fonksiyonun icine girer.

foo = get_foo()
bar = foo['bar']

Mesela ustteki kodu debug ederken debugger foo degiskeninin set edildigi satira gelince n tusuna basarsak get_foo fonksiyonunu calistirir ve bar degiskenini set ettigi satirda durur. Biz get_foo fonksiyonunuda debug etmek istiyorsak fonksiyonun cagirildigi satirda s tusuna basarak fonksiyonun icine girebiliriz. Bu sayede fonksiyonu satir satir debug edebiliriz.

Ayrica herhangi bir satirda >s get_foo() diyerekte fonksiyonu debug edebiliriz.

> u(p) [count]

count belirtilmedigi durumda icinde bulunulan fonksiyonun cagrildigi yere gider. count belirtilirse belirtilen sayi kadar uste cikar.

> r(eturn)

Debug edilen fonksiyonun return ettigi satir dahil calistirir ve return etmeden durur.

> display [expression]

Degiskenlerin aldigi degerleri izlemek icin kullanilir.

Mesela display foo dedigimizde foo degiskeninin degeri her degismesinde eski ve yeni degerlerini ekrana basar.

> retval

Bir fonksiyonun return degerini kontrol etmek icin kullanilir. Bu sayede return degerini kontrol etmek icin bir degiskene atamaktan kurtarir.

> b(reak) [ ([dosya:]satir_no | fonksiyon) [, kosul] ]

Dosyanin belirtilen satirina breakpoint koyar. Kod calistiginda o satira her gelmesinde durur. Eger parametre verilmezse var olan breakpointleri gosterir.

> disable bpnumber

Her eklenen breakpointe 1 den baslayarak artan bir numara verilir. disable belirtilen breankpointi kaldirmak icin kullanilir.

> tbreak

break komutuyla neredeyse ayni gorevi gorur. Tek farki break komutuyla bir breakpoint koydugumuzda o satira her geldiginde dururken, tbreak ile koydugumuz breakpointin oldugu satir islediginde breakpoint otomatikmen kaldirilir. Bu sayede ikinci defa ayni satir islediginde breakpoint olmadigi icin durmaz.

> unt(il) [satir_no]

Ayni dosya icinde belirtilen satira kadar calistirir.

> j(ump) satir_no

Belirtilen satira ziplamak icin kullanilir. Mesela 100. satira breakpoint koyduk ve durduk diyelim. jump 110 komutu ile ile 110. satira atladigimizda 100-110 arasi satirlari calistirmadan 110.satira ziplar. Ayrica jump 90 diyip geriye de ziplayabiliyoruz. Hatali bir satiri atlamak icin veyada calistirilan kodu tekrardan calistirmak istediginizde kullanabilirsiniz.


18/04/2018: pdb’nin butun komularini detayli anlatan bir kaynak buldum: https://realpython.com/python-debugging-pdb/

Load comments