T-106.1208 Ohjelmoinnin perusteet Y (Python) (5 op)

Debuggeri-esimerkki


Käytännön debuggeri-esimerkki

Jos et ole vielä hakenut esimerkkikoodia, hae se tästä ja tuo paketin sisältämät projektit eclipse-ympäristöösi (katso debuggeri-ohjesivulta ohje jos et osaa).

Avaa projekti debug2. Tässä projektissa on yksi moduli, buggy.py. Avaa se. Voit kokeilla ajaa ohjelman. Ohjelman on tarkoitus laskea henkilötunnuksen tarkistusmerkki. Voit antaa ohjelmalle syötteeksi esimerkiksi 290289-102. Ohjelma kaatuu virheilmoitukseen, joka on tämän kaltainen:

Traceback (most recent call last):
File "C:\Documents and Settings\pkroger\My Documents\pyharkka\debug2\src\buggy.py", line 70, in
main()
File "C:\Documents and Settings\pkroger\My Documents\pyharkka\debug2\src\buggy.py", line 68, in main
print "Tunnus on kokonaisuudessaan", muodosta_tunnus(tunnus)
File "C:\Documents and Settings\pkroger\My Documents\pyharkka\debug2\src\buggy.py", line 62, in muodosta_tunnus
merkki = tarkistusmerkki(alkuosa_luvuksi(alkuosa))
File "C:\Documents and Settings\pkroger\My Documents\pyharkka\debug2\src\buggy.py", line 9, in alkuosa_luvuksi
return int(valitulos)
ValueError: invalid literal for int() with base 10: '90289-02'

 

Virheilmoituksessa viimeisin kutsuttu funktio on alimpana ja se on yleensä kiinnostavin paikka. Huomaamme siis, että virhe on sattunut funktiossa alkuosa_luvuksi ja rivillä 9. Asetetaan siis funktioon alkuosa_luvuksi riville 9 keskeytyskohta ja käynnistetään ohjelma debug-tilassa.

Kun ohjelma keskeytyy riville 9, huomataan muuttujaikkunasta, että muuttujan valitulos arvo on "90289-02" eikä suinkaan "290289102" niin kuin piti. Ongelma on tässä aika helposti ratkaistavissa, mutta esimerkin vuoksi käytämme debuggerin suomia mahdollisuuksia.

Pysäytetään ohjelman suoritus, asetetaan uusi keskeytyskohta funktion alkuosa_luvuksi ensimmäiselle riville ja käynnistetään ohjelma uudestaan debug-tilassa.

Käydään nyt funktion alkuosa_luvuksi suoritusta läpi rivi kerrallaan. Huomaa, kuinka valitulos-muuttujan arvo muuttuu koko ajan: merkkijonoon ikään kuin tulee jokaisella silmukan kierroksella yksi merkki lisää. Yritetään löytää se i:n arvo, jolla valitulos-muuttujaan tulee ei-toivittu "-" -merkki. Muista, että muuttunut muuttuja korostuu keltaisella muuttujaikkunassa

Jos olit tarkkana, huomasit, että kun valitulos-muuttujaan tuli "-" -merkki, i:n arvo oli 6. Pysäytetään ohjelman suoritus ja kokeillaan vaihtaa rivillä 7 olevan if-lauseen ehto i != 7 ehdoksi i != 6, ja kokeillaan ajaa ohjelma uudestaan (tavallinen ajo, ei debug).

Nyt ohjelma ei enää kaadu virheilmoitukseen, mutta antaa silti väärän tuloksen (tiedetään että tunnuksen 290289-102 tarkistusmerkin pitäisi olla K eikä N - voit kokeilla omalla henkilötunnuksellasi, ohjelma laskee viimeisen merkin väärin). Kun ajetaan ohjelmaa uudelleen debuggerilla, huomataan, että funktiossa alkuosa_luvuksi valitulos-muuttujaan tulee ennen palautusta arvo 90289102 eikä 290289102 niin kuin piti, eli ensimmäinen merkki puuttuu. Tämä ratkeaa helposti muuttamalla for-silmukan alaraja yhden verran pienemmäksi (eli nollaksi), minkä tietysti olisi helposti voinut tehdä ilmankin debuggeria. Kuitenkin debuggeri auttoi paikallistamaan ongelman, ja monimutkaisemmissa ohjelmissa ja ongelmissa debuggerin hyödyt nousevat vielä selkeämmin esiin. Nyt voit kokeilla (korjattua) ohjelmaa - sen pitäisi nyt laskea oikein niin esimerkkinä käytetty 290289-102K (huom! tämä ei ole oikea henkilötunnus, minkä pienellä tarkkaavaisuudella helposti huomaakin) kuin vaikkapa oma henkilötunnuksesi.

Nyt sinun pitäisi pystyä helpohkosti tekemään seuraava pieni tehtävä: Avaa projekti debug3 (siirry ensin normaaliin näkymään). Nyt debuggerin avulla vastaa seuraaviin kysymyksiin:

  1. Mitä arvoja funktion oca muuttuja c saa ohjelman suorituksen aikana?
  2. Millä arvolla funktiota wfy kutstutaan ensimmäisen kerran?
  3. Millä funktiossa ja millä rivillä ohjelman suoritus kaatuu?
  4. Mikä on muuttujan i arvo em. funktiossa ohjelman kaatumishetkellä?
  5. Mitä dwfy-funktio tekee sille annetulle merkkijonolle?

 

Vastaukset kysymyksiin rot13-koodattuna (voit kopioída koodatun vastauksen linkitetyn webbisivun ikkunaan ja painaa Cypher-nappulaa, niin saat vastauksen selväkielisenä)

  1. Neibg abyyn wn lxfv.
  2. 0k4s00007p
  3. Shaxgvbffn vpf, evivyyä arywäxlzzragälxfv
  4. ivvfv
  5. Wnxnn fra xnuqrxfna zrexva cvghvfvva bfvva wn yvfää wbxnvfra bfna rgrra 0k.

 

Jos osasit vastata kysymyksiin, osaat käyttää debuggeria hyvin. Muista käyttää sitä myös harjoitustehtävien ongelmien etsimisessä ja ratkaisemisessa - säästät varmasti aikaa ja vaivaa.