Silumine (debug)

Silumist kasutatakse programmist vigade tuvastamiseks. Silumine võimaldab jälgida programmi mälu seisu (muutujate väärtus, käivituva rea numbrit jms) teatud ajahetkel. Näiteks on võimalik programmi jooksutada samm (rida) haaval ja vaadata, mis toimub mälus. Silumist saab kasutada ka selleks, et koodi töötamisest aru saada.

Vaata ka alljärgnevat videot koodi silumisest.

Silumist saab teostada mitmel moel. Üks võimalus on kasutada print funktsiooni ning selle abil kuvada ekraanile mõne muutuja väärtus. Näiteks kasutame lihtsat koodi:

string = "tere"
for i in range(10):
    string += string[:i // 2:2]

print(string)

Kui panete programmi käima, näete tulemust teretttttrtrtrtr. Miks selline tulemus tuleb?

Lisame koodi ühe print väljakutse:

string = "tere"
for i in range(10):
    print(f"s:{string}, i:{i}, i//2:{i // 2}, +:{string[:i // 2:2]}")
    string += string[:i // 2:2]

print(string)

Nüüd saame tulemuse:

s:tere, i:0, i//2:0, +:
s:tere, i:1, i//2:0, +:
s:tere, i:2, i//2:1, +:t
s:teret, i:3, i//2:1, +:t
s:terett, i:4, i//2:2, +:t
s:terettt, i:5, i//2:2, +:t
s:teretttt, i:6, i//2:3, +:tr
s:teretttttr, i:7, i//2:3, +:tr
s:teretttttrtr, i:8, i//2:4, +:tr
s:teretttttrtrtr, i:9, i//2:4, +:tr
teretttttrtrtrtr

See võimaldab meil jälgida, mis on igal sammul string, i, i // 2 ja liidetava alamsõne väärtused.

Mõned probleemid sellise lahendusega:

  • print(...) peab olema enne koodi käivitamist valmis pandud

  • Keset programmi jooksmist ei ole võimalik vahetada kus, millal ja mida välja prinditakse

  • Pärast vea avastamist on väga tülikas hakata print(...)-e kustutama

  • Ei ole võimalik vaadata, kust mingi väärtus tuleb, kust kuhu koodis liigutakse jne

Selline silumine toimib üldiselt igas keskkonnas ning väikeste koodide puhul sellest piisab. Mahukama ja keerulisema koodi puhul oleks mõistlik kasutada mõnda silumisvahendit. Näiteks PyCharmi on üks selline sisse ehitatud.

Silumine PyCharmis

Sarnaselt teistele IDE-dele, saab PyCharmis määrata katkestuspunkti (breakpoint) klikkides koodirea ees oleval hallil osal (kus on reanumbrid). Sinna peaks ilmuma punane ring.

See tähistab seda, et kui koodi käivitamine silumisrežiimis jõuab sellele reale, pannakse programm seisma ning antakse võimalus hetkeseisu jälgida.

Silumisrežiimi käivitamiseks tuleb menüüst valida Run -> Debug või hiirega parem klikk koodiaknas -> Debug ‚failinimi‘.

Silumisrežiimis ilmub nähtavale eraldi vaade, millega saab mäluseisu vaadelda ning programmi töötamist kontrollida. Kui koodis pole ühtegi katkestuspunkti, töötab silumisrežiim sarnaselt tavalise käivitusrežiimiga - terve programm jooksutatakse algusest lõpuni läbi.

Kui silumisrežiim jõuab kaktestuspunktini, pannakse programmitöö ootele. Koodiaknas on aktiivne rida (esialgu katkestuspunkti rida) eraldi märgistatud. Silumise paneelil (vaikimisi avaneb akna alumises osas) näidatakse automaatselt välja kõik antud hetkel väärtustatud muutujad. Sinna saab soovi korral lisada muutujaid või avaldisi.

Programmi edasist juhtimist saab kontrollida nuppudega silumisrežiimi paneeli ülaosas. Sealsed valikud:

  • Step over - liigub antud faili järgmisele reale (kui sellel real kutsutakse välja mõni funktsioon, siis selle sisse ei liiguta)

  • Step into - liigub koodis edasi järgmisele käivitatavale reale (kui sellel real kutsutakse välja mõni funktsioon, siis liigutakse selle sisse)

  • Step into my code - liigub koodis edasi järgmisele kasutaja kirjutatu reale (väliste teekide koodiread jäävad vahele)

  • Step out - liigub esimesele koodireale peale antud meetodi/funktsiooni/tsükli käivitamist

  • Run to cursor - liigub edasi tekstikursorini

Vasakul on nupud:

  • Rerun - käivitatakse silumisrežiim algusest

  • Resume program - jätkatakse programmi käivitamist kuni järgmise katestuspunktini (või lõpuni, kui katkestuspunkte pole)

Viiteid

Online Python Visualizer: http://www.pythontutor.com/visualize.html