Debuggaus

Tässä esitellään lyhyesti debuggauksen tarkoitus ja Visual Studion tärkeimmät debuggaustoiminnot. Vaikka jokaisessa kehitysympäristössä on omat debuggaustapansa, ovat periaatteet hyvin pitkälti yhteisiä eri ympäristöjen välillä.

Tämä sivu sisältää täydennyksiä monisteen lukuun 10.3 Debuggaus. Lue monisteen luku ennen tämän sivun lukemista.

1. Miksi pitää debugata?

Jos ohjelmassa on jotakin vikaa, debuggeri on usein helpoin vaihtoehto vian löytämiseksi. Ennen vanhaan ohjelmaan lisättiin sinne tänne ylimääräisiä tulostuslauseita. Debuggerin avulla ohjelma voidaan kuitenkin pysäyttää haluttuun kohtaan ja katsoa muuttujan arvot, mahdollisesti jopa vaihtaa niitä ennen ohjelman jatkamista.

Ohjelmointia opetellessa debuggeri on oiva väline askeltaa silmukoita, ehtoja ja aliohjelmia ja näin havainnollistaa ohjelman kulkua itselleen.

Jos saa ison ohjelman tutkittavakseen ja pitää korjata jotakin kohtaa eikä tiedä mistä ko. kohtaan tullaan, niin jälleen debuggeri on avuksi. Breakpoint tutkittavaan kohtaan, ohjelma käyntiin ja kun ohjelma pysähtyy breakpointtiin, niin kutsupinosta (Call Stack) voidaan katsoa reitti, mistä pysäytyskohtaan on päädytty.

2. Debuggaustila VS:ssä

Visual Studiossa ohjelma voidaan ajaa normaalina ohjelmana Ctrl-F5 tai debuggaustilassa F5. Jos ohjelmassa ei ole yhtään breakpointtia, vaikuttaa debugtilassa ajo samanlaiselta kuin normaalissa tilassa. Kuitenkin ohjelma on käännetty eri tavalla, ja sen suorittaminen voi olla aavistuksen hitaampaa, jos tarkasti mitataan.

Toisaalta jos ohjelman käynnistää debugtilassa, voidaan se milloin tahansa pysäyttää tai lisätä ohjelmaan breakpoint ja näin pysäyttää debugtilassa oleva ohjelma haluttuun kohtaan. Pelien ongelmia selvitettäessä tämä on varsin hyvä vaihtoehto. Peli laitetaan käyntiin ja kun näytölle on tullut pelioliot, käydään lisäämässä epäiltyyn ongelmapaikkaan breakpoint.

Samoin jos ohjelma tuntuu olevan totaalisen jumissa, voidaan sen ajo pysäyttää ja katsoa, missä kohti ohjelmaa ollaan menossa ja näin ehkä voidaan ratkaista, mistä ohjelman "jumi" johtuu.

3. Debuggaustoiminnot

3.1 Keskeytyskohta (breakpoint)

3.2 Debuggaustilan käynnistäminen

Ohjelma käynnistyy debuggaustilaan painamalla F5 tai valikosta Debug -> Start debugging. Tällöin ohjelman suoritus "pysähtyy" ensimmäiseen asettamaasi keskeytyskohtaan.

Huomaa, että keskeytyskohdan osoittaman punaisen pallon päällä on nyt myös keltainen nuoli, joka näyttää seuraavaksi suoritettavan rivin. Toisin sanoen, ohjelman suoritus pysähtyy keskeytyskohtaan siten, että seuraavaksi suoritusvuorossa on tutkittava rivi, jolle breakpoint on asetettu.

On mahdollista suorittaa ohjelma myös ilman debuggausta (Ctrl + F5 tai Debug -> Start without debugging). Tällöin keskeytyskohdat jätetään huomiotta. Toisaalta myös esimerkiksi poikkeuksia (exceptions) ei käsitellä Visual Studion avulla, vaan ohjelmat voivat kaatua hallitsemattomasti.

3.3 Debuggaustilan lopettaminen (ohjelman ajon lopettaminen)

Debuggauksen voi lopettaa painamalla Shift + F5 tai valikosta Debug -> Stop debugging.

3.4 Askellus (Step into, Step over)

Koodia voidaan askeltaa rivi kerrallaan. Tällöin ohjelman suoritus etenee debuggaustilassa rivi kerrallaan eteenpäin. Askellukseen on kaksi erilaista tapaa

  • Step into (F11), askelletaan myös kutsuttavien aliohjelmien koodi riveittäin
  • Step over (F10), aliohjelmakutsujen koodi suoritetaan kerralla ilman askellusta, eli tavallaan hypätään aliohjelman yli

3.5 Muuttuja-arvot (locals)

Debuggaus‐näkymässä Locals-paneelissa näkyy kaikki tällä hetkellä näkyvillä olevat muuttujat (paikalliset, eli lokaalit muuttujat) ja niiden arvot.

3.6 Watch

Watch-paneeli on kuten Locals-paneeli, mutta käyttäjä määrittelee itse, mitä muuttujia haluaa seurata suorituksen aikana. Yksittäisten muuttujien lisäksi Watch-paneeliin voi lisätä lausekkeita, esimerkiksi taulukko[i] > suurin (tuottaisi true tai false).

  1. Aseta keskeytyskohta haluamaasi paikkaan ja aloita debuggaus.
  2. Etsi koodista se muuttuja (tai lauseke), jonka tilaa haluat tarkkailla ajon aikana. Valitse se (maalaamalla esimerkiksi hiirellä), klikkaa sitten hiiren oikealla ja valitse Add Watch. (Alla olevassa kuvassa lisätään suurin-muuttuja watch-paneeliin.

  1. Voit lisätä eri "watcheja" haluamasi määrän. Alla lisätään myös i, taulukko[i] ja taulukko[i] > suurin watch-paneeliin.

Huomaa, että watch-paneeliin lisäämäsi muuttuja (tai lauseke) ei välttämättä ole olemassa (ts. ei ole luotu tai ei "näy" sillä hetkellä), joten luonnollisestikaan tilaa ei voida tällöin tutkia. Alla olevassa kuvassa suoritus on menossa vasta rivillä 12.

Tässä esimerkissä i, taulukko[i] ja taulukko[i] > suurin ovat paikallisia muuttujia (lausekkeita) EtsiSuurin-lohkossa ja tulevat näkyviin kun ohjelman suoritus etenee sinne saakka.

Nyt watch-ikkunasta on helppo tarkastella esimerkiksi taulukon arvoja sitä mukaa kun silmukka etenee. Juuri muuttuneet arvot merkitään punaisella, aivan kuten Locals-paneelissa.

3.7 Ehdollinen keskeytyskohta

Ehdollinen keskeytyskohta ei toimi VS Express -versioissa. Halutessasi käyttää ehdollista keskeytyskohtaa valitse Visual Studio Professional- tai Ultimate.

Debuggerin avulla voidaan lisätä myös ehdollinen keskeytyskohta eli Breakpoint Condition (joissain muissa IDEissä myös conditional breakpoint). Sen avulla debuggeri keskeyttää ohjelman suorittamisen breakpointin kohdalle heti kun breakpointille annettu ehto toteutuu. Ehto voi olla esimerkiksi muuttujan tietty arvo. Ehdon voi lisätä seuraavasti:

  1. Siirry haluamallesi riville koodissa
  2. Siirry rivin vasemman marginaalin harmaaseen alueeseen ja klikkaa siihen breakpoint (näkyy punaisena täplänä)
  3. Paina breakpointin kohdalla hiiren oikeaa näppäintä saadaksesi esiin valikon
  4. Valitse valikosta Condition, ilmestyy ikkuna Breakpoint Condition
  5. Tekstikenttään voidaan lisätä ehto esimerkiksi luku == 4 (ei int luku = 4, ehtoon ei myöskään voi laittaa if-sanaa), jolloin debuggeri keskeyttää ohjelman suorittamisen, kun muuttujan luku arvo on 4. Ehto voi olla mikä tahansa totuusarvoinen lauseke, joka kirjoitetaan esim. if-lauseen sulkuihin. Muutamia muita esimerkkejä:
      i > 3
      luvut[i+2] != 3
      pallot[i] == null
    
  6. Debuggaa (F5)
  7. Kun pysähtyy, tarkastele Locals- ja Watch-ikkunoista muuttujien arvoja ja jatka tarvittaessa Step into (F11), Step over (F10) tai Continue (F5).

3.8 Hit Count

Hit Countilla voit laittaa ehdon niin, että kun näin monennen kerran tullaan keskeytyskohtaan, niin silloin pysähdytään.

Attachments