Python'da pdb ile debugging
Mar 18, 2017 · 3 minute read · Commentsprogrammingpython
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 ipdb
yi 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.
- > break 9: 9. satira gelince durur.
- > break 9, a > 2: 9. satira geldiginde
a
degiskeni varsa ve 2’den buyukse durur. - > break get_foo:
get_foo
fonksiyonu cagrildiginda durur. - > break account/users.py:100:
users.py
dosyasinda 100. satira gelince durur.
> disable bpnumber
Her eklenen breakpointe 1 den baslayarak artan bir numara verilir. disable
belirtilen breankpointi kaldirmak icin kullanilir.
- > disable 1 ilk koydugumuz breakpointi kaldirir.
> 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/