Python'da pdb ile debuggingMar 18, 2017 · 3 minute read · Comments
programmingpython
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 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.
- >break 9: 9. satira gelince durur.
- >break 9, a>2: Breakpointin oldugu satira geldiginde
adegiskeni varsa ve 2’den buyukse durur.
- >break get_foo:
get_foofonksiyonu cagrildiginda durur.
> 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 silinir. 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.