Debuggaus

Debuggaus on termi, jota käytetään ohjelmistotyössä tarkoittamaan ohjelmassa olevien virheiden paikantamista ja korjaamista. Usein, joskaan ei aina, virhekohdan löytäminen ohjelmasta on debuggauksen haastavin vaihe.

Jotta virhekohtaa voisi yleensäkään ottaen yrittää löytää, täytyy olla tietoinen virheen olemassaolosta. Tämä voidaan saavuttaa vain testaamalla ohjelmaa erilaisilla syötteillä ja vertailemalla saatuja tuloksia oikeiksi tiedettyihin tuloksiin. Testaamisen perusideoita käsiteltiin lyhyesti edellisellä ohjelmointikurssilla.

Tässä on tarkoitus esitellä yleisellä tasolla muutama käyttökelpoinen mekanismi, joiden avulla virheen syytä voidaan etsiä sen jälkeen, kun ohjelman on havaittu toimivan virheellisesti.

Ensimmäinen mekanismi, jota hyödynnettiin etenkin edellisellä ohjelmointikurssilla, on testitulosteet. Testitulosteilla tarkoitetaan ohjelmakoodiin oletetun virhekohdan ympärille puhtaasti testaustarkoituksessa lisättyjä tulostuskäskyjä (print, cout), joiden avulla ohjelman etenemistä ja kiinnostavien muuttujien arvoja voidaan seurata. Ideana on tietysti se, että järkeilemällä tulostuneista muuttujien arvoista ja testitulosteiden tulostumisjärjestyksestä voidaan päätellä, missä kohdassa toiminta menee pieleen. Koska testitulosteet ovat entuudestaan tuttu virhekohdan etsintämekanismi, sitä ei ole tarpeen pohtia tätä pidemmälle.

Toinen monissa tilanteissa huomattavasti käyttäjäystävällisempi virheenjäljitysmekanismi on nk. debuggerin käyttö. Debuggeri on erillinen ohjelma, jonka alaisuudessa testattavaa ohjelmaa voidaan suorittaa.

Debuggerin käyttö ja toiminnallisuus riippuvat käytetystä ohjelmointikielestä ja kääntäjästä tai tulkista, mutta tyypillisesti ainakin seuraavat operaatiot on jollakin tavoin tuettu:

  • keskeytyskohtien (breakpoint) asettaminen (kriteereinä riville saapuminen, määrätyn funktion kutsu tai muuttujan käsittely)
  • ohjelman suorittaminen käsky tai funktio kerrallaan (askeltaminen, stepping)
  • muuttujien tilan (arvon) seuraaminen
  • funktiokutsuhierarkkian tutkiminen (stack trace).

Yleensä virhekohdan etsiminen etenee jotenkin seuraavasti:

  1. Selvitetään summittainen vikapaikka (siis muodostetaan valistunut arvaus paikasta, jossa vika voisi sijaita). Tämä voi tapahtua joko testaamalla tai, jos ohjelma kaatuu suorituksen aikana, etsimiseen voi käyttää debuggeria.
  2. Asetetaan keskeytyskohta ennen oletettua virhekohtaa ja käynnistetään ohjelma debuggerin alaisuudessa.
  3. Suoritetaan ohjelmaa keskeytyskohdasta eteenpäin käsky kerrallaan ja seurataan muuttujien arvojen kehittymistä, funktioiden paluuarvoja jne., kunnes niistä toivottavasti voidaan päätellä virheen syy.
  4. Jos virhe ei löydy ensimmäisellä yrittämällä, on yleensä hyvä ajatus pyrkiä haarukoimaan virhekohtaa siirtämällä keskeytyskohtaa eteen- tai taaksepäin.