Šta je debagovanje?

uredi
"Čim smo počeli sa programiranjem, otkrili smo na naše iznenađenje da nije lako da dobijemo pravi program kao što smo mislili. Otkrivanje grešaka, debagovanje, moralo bi da bude otkriveno. Ja mogu da se setim tačnog trenutka kada sam shvatio da je to veliki deo mog života od tada sam rešio da bi trebalo da se potroši u pronalaženju greške u svojim programima." — Maurice Wilkes discovers debugging, 1949

Ako ste se do sada igrali sa programima verovatno ste shavtili da program ponekad radi nešto što vi niste želeli da uradi. Ovo je prilično uobičajeno. Debagovanje je proces razumevanja šta računar radi i onda ga napišete da radi tačno ono šta hoćete. To može biti nezgodno. Jednom sam proveo gotovo nedelju u promalaženju i fiksiranju greške koja je uzrokovana nečijim stavljanjem x gde je y trebalo da bude.

Ovo poglavlje će biti više apstraktno nego prethodna poglavlja.

Šta bi program trebalo da radi?

uredi

Prvu stvar koju treba da uradi (ovo zvuči očigledno) je da shvati šta bi program trebalo da radi ako je dobro pokrenut. Smislite neki test slučajeva i vidite šta se dešava. Na primer, da kažemo da imam program za računanje obima pravougaonika (zbir dužine svih ivica). Imam sledeće testove:

visina širina obim
3 4 14
2 3 10
4 4 16
2 2 8
5 1 12

Sada pokrećem program na svim slučajevima testa i vidim da program radi ono što sam očekivao. Ako ne radi onda moram da saznam šta računar radi.

Češći su neki od slučajeva da će test raditi od nekih da neće. Ako je to slučaj trebalo bi da pokušate i shvatite Šta oni koji rade imaju zajedničko. Na primer ovde je izlaz za izračunavanje obima (videćete kod za trenutak):

Висина: 3
Ширина: 4
обим = 15
Висина: 2
Ширина: 3
обим = 11
Висина: 4
Ширина: 4
обим = 16
Висина: 2
Ширина: 2
обим = 8
Висина: 5
Ширина: 1
обим = 8

Primetite da nije radio za prva dva unosa, radio je za sledeća dva i nije radio na poslednjem. Pokušajte da shvatite šta je zajedničko onima koji rade. Jednom kada imate ideju šta je problem pronalaženje uzroka je lakše. Sa vašim ličnim programima trebalo bi da pokušate sa više testova ako vam zatrebaju.

Šta program radi?

uredi

Sledeća stvar koju treba da uradite je da pogledate izvorni kod. Jedna od najvažnijih stvari koje treba da uradite dok programirate jeste da čitate izvorni kod. Osnovni način da uradite ovo je da prođete kroz kod.

Prolazak kroz kod počinje na prvoj liniji, i taje dok se program ne završi. While petnje i if izjave znače da neke linije možda nikad neće biti pokrenute i da će neke biti pokrenute više puta. Na svakoj liniji shvatate šta je Pajton uradio.

Počnimo sa jednostavnim programom obima. Ne kucajte ga, samo ga pročitajte, i ne pokrećite. Izvorni kod je:

висина = input("Висина: ")
ширина = input("Ширина: ")
print "обим =", ширина + бисина + ширина + ширина
Pitanje: Šta je prva linija što Pajton pokreće?
Odgovor: Prva linija se uvak prva pokreće. U ovom slučaju to je: висина = input("Висина: ")
Šta ta linija radi?
Štampa Висина: , čeka da korisnik ukuca broj, i stavlja to u promenljivu visina.
Šta je sledeća linija koju pokreće?
U opštem slučaju, to je sledeća linija što je: ширина = input("Ширина: ")
Šta ta linija radi?
Štampa Ширина: , čeka da korisnik ukuca broj, i stavlja to u promenljivu širina.
Šta je sledeća linija koju pokreće?
Kada sledeći red nije uvučen više ili manje od trenutne linije, to je linija odmah nakon toga, pa je to: print "обим = ", ширина + висина + ширина + ширина (Takođe može pokrenuti funkciju u odgovarajućem redu, ali to je sledeće poglavlje.) Šta ta linija radi?
Prvo štampa обим = , zatim štampa ширина + висина + ширина + ширина.
Da li ширина + висина + ширина + ширина računa obim pravilno?
Da vidimo, obim pravougaonika je donja stranica (širina) plus leva stranica (visina) plus gornja stranica (širina) plus desna stranica (ha?). Poslednji podatak bi trebalo da bude dušina desne stranice, ili visina.
Da li razumete zašto je u neko vreme obim bio računan "pravilno"?
Bio je dobro računana kada su visina i širina jednake.

Sledeći program koji ćemo raditi prolaskom kroz kod je program koji bi trebalo da štampa pet tačaka na ekranu. Međutim, ovo je ono što program izbacuje:

. . . . 

I ovde je program:

број = 5
while број > 1:
    print ".",
    број = број- 1
print

Prolazak kroz ovaj program je mnogo složeniji jer sada ima uvučene delove (ili kontrolne strukture). Hajde da počnemo.

Koja je prva linija kroz koju će proći?
Prva linija datoteke: број = 5
Šta ova linija radi?
Stavlja broj 5 u promenljivu broj.
Koja je sledeća linija?
Sledeća linija je: while број > 1:
Šta ona radi?
Pa, while izjava u globalu na njihov izraz, i ako je to tačno rade sledeći blok koda, u suprotnom preskoče uvučeni blok koda.
Pa šta sada radi?
Ako je број > 1 tačno onda će se pokrenuti dve sledeće linije.
Da li je број > 1?
Poslednje dve date vrednosti број su 5 i 5 > 1 tako da jesu.
Pa šta je u sledećoj liniji?
Odkad je while tačno sledeća linija je: Print ".",
Šta ta linija radi?
Štampa jednu tačku i pošto se izjava završava sa ',' sledeća izjava štampanja neće biti u drugoj liniji reda.
Šta je u sledećoj liniji?
број = број - 1 pošto je to sledeća linija i tu neka nikakvih promena.
Šta to radi?
Računa број - 1, što je odgovarajuća vrednost број (ili 5) koji oduzima 1, i stvara novu vrednost broja. Pa u osnovi menja број'nu vrednost sa 5 na 4.
Šta je sledeća linija?
Pa, sledeći nivo opada tako da moramo da pogledamo šta je tip kontrolne strukture. To je while petnja, pa moramo da se vratimo na while tačku što je while број > 1:
Šta ovo radi?
Pogleda vrednost broja, što je 4, i poredi je sa 1 i pošto je 4 > 1 while petlja se nastavlja.
Šta je sledeća linija?
Pošto je while petlja tačna, sledeća linija je: print ".",
Šta ona radi?
Štampa sledeću tačku u liniji.
Šta je sledeća linija?
Ništa se ne menja pa je: број = број - 1
I šta ovo radi?
Uzima odgovarajuću vrednost broja (4), oduzme 1, što daje 3 i na kraju stvara 3 novu vrednost broja.
Šta je sledeća linija?
S obzirom na to da je promena izazvana na kraju while petlje, sledeća linija je: while број > 1:
Šta ona radi?
Poredi odgovarajuću vrednost broja (3) sa 1. 3 > 1 pa se while petlja nastavlja.
Šta je u sledećoj liniji?
S obzirom da su uslovi u while petlji tačni sledeća linija je: print ".",
I šta radi?
Treća tačka je upisana u liniji.
Šta je sledeća linija?
To je: број = број - 1
Šta radi?
Uzima odgovarajuću vrednost broja (3) oduzima mu 1 i pravi 2 kao novu vrednost broja.
Šta je sledeća linija?
Nazad do početka while petlje: while број > 1:
Šta radi?
Poredi odgovarajuću vrednost broja (2) sa 1. Pošto je 2 > 1 while petlja se nastavlja.
Šta je sledeća linija?
Pošto se while petlja nastavlja: print ".",
Šta ovo radi?
Otkriva značenje života, univerzuma i svega. Šalim se. (Moram da se pobrinem da ste budni.) Linija štampa četvrtu tačku na ekranu.
Šta je sledeća linija?
To je: број = број - 1
Šta radi?
Uzima odgovarajuću vrednost broja (2) oduzima mu 1 i dobija 1 novu vrednost broja.
Šta je sledeća linija?
Povratak u while petlju: while број > 1:
Šta ta linija radi?
Poredi odgovarajuću vrednost broja (1) sa 1. Pošto 1 > 1 je netačno (jedan nije veće od jedan), while petlja postoji.
Šta je sledeća linija?
S obzirom da je stanje while petlje netačno sledeća linija je linija posle while petlje, ili: print
Šta ta linija radi?
Čini da ekran pređe u sledeći red.
Zašto program ne štampa 5 tačaka?
Petlja izlazi jednu tačku ranije.
Kako možemo to da ispravimo?
Napravimo da petlja izađe jednu tačku ranije.
I kako to da uradimo?
Postoji nekoliko načina. Jedan način je da promenimo while petlju u: while број > 0: Drugi način je da promenimo uslove u: број >= 1 Postoji još nekoliko.

Kako prepravljam program?

uredi

Morate da razumete šta program radi. Treba da shvatite šta bi program trebalo da radi. Nađite razliku između ova dva. Debagovanje je veština koja mora da bude uvežbana da bi bila naučena. Ako ne mođete da razumete posle sat vremena, napravite pauzu, razgovarajte sa nekim o problemu ili razmišljajte o vlaknu u vašem pupku. Vratite se u petlju i verovatno ćete imati nove ideje za ovaj problem. Srećno.


Šablon:Vodič za Pajton 2.6/Navigation