Ensimmäinen projekti
Debuggaus
Debuggaus tarkoittaa ohjelmassa olevien virheiden paikantamista ja korjaamista. Usein virheen löytämisen vaikein osa on selvittää, missä ohjelman toiminta poikkeaa siitä, mitä sen pitäisi tehdä.
Virheen etsiminen alkaa siitä, että tiedämme ohjelman toimivan väärin. Tämä saadaan selville testaamalla ohjelmaa erilaisilla syötteillä ja vertaamalla tuloksia oikeiksi tiedettyihin tuloksiin. Testaamisen perusideoihin tutustuttiin jo edellisellä ohjelmointikurssilla.
Tässä luvussa esitellään muutamia yleisiä keinoja, joilla virheen syytä voi tutkia sen jälkeen, kun ohjelma on havaittu virheelliseksi.
Testitulosteet
Yksinkertainen tapa seurata ohjelman toimintaa on lisätä oletetun virhekohdan ympärille testitulosteita. Testitulosteet ovat testaustarkoituksessa lisättyjä tulostuskäskyjä, kuten Pythonin print tai C++:n cout. Niiden avulla voi tarkastella, mihin asti ohjelman suoritus etenee ja millaisia arvoja kiinnostavilla muuttujilla on.
Kun tulosteita ja niiden järjestystä tarkastelee, voi päätellä, missä vaiheessa toiminta menee pieleen. Testitulosteet ovat tuttu menetelmä aiemmalta kurssilta, joten keskitymme tässä seuraavaksi debuggeriin.
Debuggerin käyttö
Debuggeri on ohjelma, jonka avulla testattavaa ohjelmaa voidaan suorittaa hallitusti ja tutkia sen tilaa. Debuggerin ominaisuudet riippuvat kielestä ja kehitysympäristöstä, mutta tavallisesti sillä voi:
- asettaa keskeytyskohtia (breakpoint) esimerkiksi tietylle koodiriville
- suorittaa ohjelmaa askel kerrallaan tai funktio kerrallaan (stepping)
- seurata muuttujien arvoja suorituksen aikana
- tutkia funktiokutsujen ketjua eli kutsupinoa (stack trace).
Keskeytyskohta pysäyttää ohjelman halutussa kohdassa. Sen jälkeen ohjelmaa voi askeltaa ja tarkkailla, miten muuttujien arvot sekä funktioiden paluuarvot muuttuvat.
Virheen paikantamisen työvaiheet
- Rajaa mahdollinen vikakohta. Testaa ohjelmaa ja muodosta valistunut arvaus kohdasta, jossa virhe voi olla. Jos ohjelma kaatuu, debuggerin avulla voi tutkia tilannetta kaatumishetkellä.
- Aseta keskeytyskohta ennen oletettua virhekohtaa ja käynnistä ohjelma debuggerissa.
- Askelda ohjelmaa eteenpäin ja seuraa muuttujia sekä funktiokutsuja, kunnes virheen syy alkaa selvitä.
- Rajaa aluetta uudelleen, jos virhe ei löydy. Siirrä keskeytyskohtaa eteen- tai taaksepäin ja tutki sopivaa osaa ohjelmasta tarkemmin.
Virheen löytyminen vaatii usein useamman kierroksen. Debuggeri auttaa näkemään ohjelman todellisen tilan, kun taas testitulosteet voivat auttaa nopeasti tarkistamaan yksittäisen oletuksen.
Virheet kääntämisen ja linkityksen aikana
Kaikki virheet eivät synny ohjelman suorituksen aikana. C++-ohjelman kääntämistä seuraa erillinen linkitysvaihe. Linkityksessä voi tulla virhe, jos esimerkiksi funktio on esitelty mutta sen toteutus puuttuu tai toteutus ei vastaa esittelyä. Tällainen ongelma korjataan tarkistamalla koodin esittelyt, toteutukset ja projektin lähdetiedostot; debuggeria käytetään varsinaisten ajonaikaisten virheiden tutkimiseen.
Video: Virheiden etsintä ja debuggaus (12 min)
Videolla käydään läpi kääntämisen jälkeistä linkitystä ja debuggerin käyttöä ajonaikaisten virheiden etsimisessä. Siinä huomataan myös, että vektorin indeksejä käsiteltäessä at-metodi antaa tarkistuksen, jota hakasulkuoperaattori [] ei tee.
Katso video: Virheiden etsintä ja debuggaus.
Muista: testaus kertoo, että virhe on olemassa. Debuggeri auttaa seuraamaan suoritusta ja löytämään, miksi se syntyy.