Virheiden etsintä ja debuggerin käyttö Turbo Pascal -ympäristössä

Sisällysluettelo

1. Yleistä virheistä

Virhe => virhetoiminto on havaittu eroavaisuus ohjelmiston toiminnassa ja määrityksissä. Ohjelmassa voi olla kolmen tyyppisiä virheitä: käännösaikaisia, ajonaikaisia ja loogisia.

Käännösaikainen eli kielioppivirhe syntyy, kun muuttujaa ei ole esitelty, aliohjelman kutsussa on väärät parametrit tai kun kokonaisluku-muuttujaan sijoitetaan reaaliarvot. Pascalissa on muihin ohjelmointikieliin verrattuna tarkat säännöt, joten kielioppivirheiden poistamisen jälkeen suurin osa virheistä on jo löytynyt.

Ajonaikainen virhe eli semanttinen virhe syntyy kun virheettömästi käännetty ohjelma yrittää esimerkiksi avata olemattoman tiedoston lukemista varten tai jakaa luvun nollalla.

Loogiset virheet taas syntyvät kun ohjelma tekee niinkuin käskit mutta ei niin kuin haluat. Esimerkiksi muuttuja saattaa olla alustamatta tai laskutoimitukset saattavat olla virheellisiä. Tällainen virhe on vaikein löytää ja sen etsinnässä tutkintaohjelmasta on eniten apua.

Muitakin virheitä on toki olemassa, esimerkiksi ympäristövirheet, joita voivat olla esim. laitevirheet. Versionhallintavirheessä ohjelma ei esimerkiksi kerro versiotaan. Testausvirheitä ovat mm. havaitsemattomat virheet.

Virheiden vaikutus vaihtelee vähäisistä katastrofaalisiin.

Takaisin alkuun

2. Virheen etsinnästä

Pyri testatessasi siihen, että jokainen ohjelman haara tulee suoritetuksi ainakin kerran. Virheitä etsiessäsi tarkista ainakin seuraavat asiat:

  • Kaikki tunnukset on esitelty.

  • Muuttujilla on alkuarvot.

  • Aliohjelmakutsujen parametrin järjestys ja lukumäärä on oikea.

  • Taulukoiden indeksien järjestys ja lukumäärä on oikea.

  • Suoritusaikana ei pääse syntymään kelvottomia taulukkoindeksien arvoja, nollalla jakoa, kokonaisluvun ylivuotoa tai viittausta NUL -osoittimen kautta.

  • Mahdolliset poikkeustilanteet on huomioitu (esimerkiksi tiedoston puuttuminen, tyhjään rakenteeseen lisäys, tiedoston loppuminen tms.) ja että ohjelma ei sisällä päättymättömiä silmukoita, ts. jokaisesta toistosta päästään pois.

2.1 Silmukan tarkastaminen

    Silmukka tarkastetaan ainakin seuraavilla arvoilla:

  • Minimiarvo
  • Maksimiarvo
  • Nolla
  • Jokin tyypillinen arvo

2.2 Numeeristen arvojen tarkastaminen

    Numeeriset arvot tarkastetaan seuraavasti:

  • Liian pieni arvo ja pienintä sallittua yhtä pienempi arvo
  • Liian suuri arvo ja suurinta arvoa yhtä suurempi arvo
  • Pienin sallittu
  • Pienin sallittu + 1
  • Suurin sallittu
  • Suurin sallittu - 1
  • Jokin kelvollinen arvo

2.3 Merkkijonosyötteitten tarkastaminen

    Merkkijonot tarkastetaan seuraavasti:

  • Tyhjä jono
  • Yhden mittainen jono
  • Kelvollisen mittainen jono
  • Maksimipituinen jono
  • Liian pitkä jono
  • Vain kirjaimia sisältävä jono
  • Vain numeroita sisältävä jono
  • Sekä kirjaimia että numeroita sisältävä jono
  • Erikoismerkkejä sisältävä jono

Takaisin alkuun

3. Turbo Pascalin debuggerin käyttö

3.1 Debuggauksen aloitus


Debuggauksen aloittamisessa ovat seuraavat vaihtoehdot:
  • Debug menu
  • Run menu
  • Debugger hot keys
  • Alt-D

3.2 Keskeytysloukut

Keskeytysloukku on rivi, jossa ohjelma pysähtyy. Kun tutkintaohjelma huomaa keskeytysloukun, se keskeyttää ohjelman ajon ja korostuspalkki osoittaa, missä lauseessa katkos on. Tämän jälkeen voit tutkia eri muuttujia, aloittaa askelluksen tai ajaa ohjelman seuraavaan keskeytysloukkuun. Voit keskeyttää ajon milloin tahansa myös CTRL-Break-näppäimellä. Ohjelma pysähtyy seuraavalle lähdekieliselle riville aivan kuin tällä olisi keskeytysloukku. Tärkeää on huomata, että keskeytysloukut ovat olemassa vain virheiden etsinnän aikana; niitä ei tallenneta EXE-tiedostoon, mikäli ohjelma käännetään levylle.

3.2.1. Keskeytysloukkujen asettaminen

Voit asettaa keskeytysloukun Break/Watch/Toggle Breakpoint -komennolla tai Ctrl-F8-näppäimellä ja ajaa ohjelman Run/Run-komennolla tai Ctrl-F9-näppäimellä). Tämän tapahtuman jälkeen ohjelma pysähtyy aina, kun se saavuttaa kyseisen rivin. Voit asettaa useita keskeytysloukkuja (max 21), jolloin ohjelma pysähtyy jokaisen keskeytysloukun kohdalla. Keskeytysloukkuja ei tulisi sijoittaa sellaisille riveille, joilla ei ole suorittavaa lausetta. Esimerkiksi selitykset, kääntäjän ohjauskäskyt ja muuttujien esittelyt ovat rivejä, joille ei pidä asettaa keskeytyksiä.

3.2.2. Keskeytysloukkujen katsominen, editointi ja poistaminen

Sen jälkeen, kun olet asettanut keskeytysloukut, voit käynnistää ohjelman. Ohjelman ajo alkaa normaalisti. Keskeytysloukun kohdalla ohjelma pysähtyy ja tarvittava lähdekielinen tiedosto luetaan muistiin. Kohdistinpalkki näyttää keskeytysloukun sisältävän rivin, mutta on huomattava, että katkos ei näy korostettuna silloin, kun kohdistinpalkki on sen päällä. Mikäli Watch-ikkunaan on lisätty muuttujia tai lausekkeita, niiden arvot tulostuvat näyttöön. Tässä vaiheessa voit käyttää kaikkia virheidenetsintäkomentoja. Voit käyttää askellusta, tutkia ja vaihtaa muuttujien arvoja, lisätä lausekkeita Watch-ikkunaan ja poistaa niitä. Lisäksi voit lisätä ja poistaa keskeytysloukkuja. Komennolla Run/User Screen (Alt-F5) voit tutkia ohjelman tulostusta ja voit aloittaa ohjelman uudelleen alusta tai jatkaa ajoa seuraavaan katkokseen asti. Voit poistaa keskeytysloukun riviltä siirtämällä kohdistimen kyseiselle riville ja antamalla komennon Break/Watch/Toggle Breakpoint (Ctrl-F8) uudelleen. Kaikki katkokset voit poistaa komennolla Break/Watch/Clear All Breakpoints.

3.3 Askellus

Voit suorittaa ohjelman yhden rivin ja pysähtyä tulosten tarkastamista varten. Kun ohjelma kutsuu aliohjelmaa, voit valita, suoritetaanko kutsu yhdellä kertaa vai käydäänkö aliohjelma läpi rivi riviltä. Mikäli Edit-ikkunassa on ohjelma, se pitää kääntää ennen virheiden etsinnän aloittamista. Tämän voit tehdä komennolla Compile/Make (F9) tai Run/Trace Into (F7). Edellinen kääntää ohjelman ja jälkimmäinen sekä kääntää ohjelman että sijoittaa kohdistinpalkin tämän ensimmäiselle riville. Tämän jälkeen voit suorittaa ko. rivin komennolla Run/Trace Into tai Run/Step Over. Näiden kahden komentojen ero on siinä, Trace Into-komento askeltaa myös lause- ja funktioaliohjelmat, kun taas Step Over-komento ajaa läpi nämä pysähtymättä.

Seuraavassa on esitelty askelluksessa tarvittavat komennot ja selitetty lyhyesti kunkin toiminnan sisältö.

Ctrl-F9 Run/Run Ajaa ohjelman; antaa tarvittaessa make-komennon

Ctrl-F2 Run/Program Reset Päättää virheiden etsinnän, vapauttaa varatun muistin ja sulkee tiedostot

F4 Run/Go to Cursor Ajaa riville, jolla kohdistin on. Aloittaa virheiden etsinnän.

F7 Run/Trace Into Suorittaa rivin. Aliohjelman kutsu aiheuttaa hypyn ko. aliohjelmaan. Aloittaa virheiden etsinnän.

F8 Run/Step Over Suorittaa rivin, mutta ei siirry aliohjelmaan. Aloittaa virheiden etsinnän.

3.4 Jäljitysloukut

3.4.1 Jäljitysloukun asettaminen

Jäljitysloukkua käytetään muuttujan arvon seuraamiseen. Toiminto asetetaan päälle seuraavasti: maalataan haluttu muuttuja ja valitaan valikosta debug - add watch. Näytölle ilmestyy laatikko, jossa on oletuksena valittu muuttuja - hyväksytään OK:lla. Sen jälkeen valitaan debug - watch, jolloin näytön alareunaan ilmestyy ikkuna, joka näyttää kyseisen muuttujan arvojen vaihtumisen - mutta vain niin kauan, kuin ollaan ohjelmanosan "vaikutusalueella". Kun add - watch -ikkunaan valitaan aliohjelman muuttuja, niin watch -ikkunassa on kyseisen muuttujan kohdalla ilmoitus, että muuttuja on tuntematon. Kun ohjelma etenee aliohjelmaan saakka, niin kyseisen muuttujan kohdalle watch -ikkunaan ilmestyy muuttujan arvo.

Toiminto on erittäin hyvä, kun halutaan seurata, kuinka muuttujan arvo vaihtelee esim. rekursiossa. Toiminnon saa päälle alueen maalauksen jälkeen myös painamalla oikeata hiiren painiketta ja valitsemalla add watch, sen jälkeen painetaan oikeata hiiren painiketta uudelleen ja valitaan watch.

Kun jäljitysloukku on valittu watch -laatikkoon, niin se voidaan asettaa tilapäisesti niin, että se ei näytä arvoja (oikea hiiren painike watch-ikkunan päällä - disable) ja tuoda uudelleen käyttöön käyttöön (oikea hiiren painike watch-ikkunan päällä - enable), jolloin se näyttää sen arvon, joka on muuttujan arvona sillä hetkellä.

3.4.2 Jäljitysloukun poistaminen

Jäljitysloukku poistetaan painamalla oikeata hiiren painiketta watch-ikkunan päällä ja valitsemalla remove.

3.5 Arvojen muuttaminen

Evaluate /modify -toimintoa käytetään arvojen tarkastamiseen ja muuttamiseen. Voit valita sen joko aliohjelman tai pääohjelman aikana tarkastaaksesi muuttujan arvon. Tällöin arvoa voi muuttaa ja yrittää tällä tavalla päästä esim. silmukkaan, johon ohjelma ei muuten päästä. Toiminto käynnistetään seuraavasti: debug - modify /evaluate. Näytölle avautuu ikkuna, jonka sisällä oleviin laatikoihin arvot asetetaan:

  • expression: Kirjoita tähän haluamasi muuttujan nimi.

  • result: Tässä näkyy muuttujan nykyinen arvo, kun on painettu oikalla olevaa evaluate -painiketta.

  • new value: Kirjoita tähän haluamasi uusi arvo ja paina modify-painiketta oikealla puolella. Uusi arvo ilmestyy myös result-laatikkoon.

HUOM. Jos olet pääohjelmassa, niin et voi laittaa evaluate /modify -laatikkoon aliohjelman muuttujan nimeä, koska toiminto ei tunnista aliohjelman muuttujaa vielä pääohjelmassa, ja vaikka laittaisitkin aliohjelman muuttujalle oletusarvon pääohjelmassa, niin muuttuja huomioi vain sen syötteen, jonka pääohjelma antaa sille aliohjelman kutsun aikana.

3.6 Arvojen seuranta

Voit seurata arvoja kolmen eri toiminnon avulla.

3.6.1 Go to cursor

Go to cursor - toiminto mahdollistaa ohjelman ajon ja automaattisen pysähtymisen tietylle riville, jolle olet asettanut kursorin. Tällöin voit tutkia muuttujaa esim. evaluate /modify -ikkunassa. Toiminto käynnistyy valinnalla: run - go to cursor, ja katoaa, kun otat uudelleen saman valinnan sen jälkeen, kun ohjelma on pysähtynyt kursorin kohtaan.

3.6.2 Call stack

Call stack luo pienen ikkunan ruudun alareunaan. Ikkunassa näkyvät kaikki aliohjelma- ja funktio-kutsut sekä niiden parametrien arvot, jotka muuttuvat automaattisesti ohjelman suorituksen aikana. Ikkuna käynnistetään valitsemalla: debug -call stack Tässä vaiheessa ohjelman ja aliohjelmien nimiä ei vielä näy, vaan ne ilmestyvät ikkunaan ohjelman etenemisen myötä. Ikkuna katoaa, jos näpäytät hiiren painiketta ikkunan ulkopuolella, ja saat sen takaisin valitsemalla uudelleen: debug - call stack.

3.6.3 Output

Output -valinnalla voit seurata arvojen muuttumista sellaisena, kuin se tapahtuu ohjelman dos-tasolla. Toiminto otetaan käyttöön valitsemalla: debug - output, ja tällöin näytön ilmestyy musta ikkuna, johon tulevat samat, käyttäjälle palautetta antavat arvot, kuin dos-ikkunassa on, joten tämän toiminnon ansiosta arvoja ei tarvitse käydä tarkistamassa dos shell -komennolla.

3.7 Debuggauksen keskeytys /lopetus

Voit palata Turbo Pascal ympäristöön painamalla mitä tahansa näppäintä

Takaisin alkuun

4. Virheilmoitukset

  • Don't know how to make XXXXXX
    Tämä ilmoitus tulostuu, kun komennossa mainittua tiedostoa ei löydy.

  • Error directive:XXXXXX
    Tämä ilmoitus tulostuu, kun löytyy #error-käsky. Virheilmoituksen perään tulostuu käskyyn kirjoitettu teksti.

  • Incorrect command line argument:XXXX
    Tämä virhe aiheutuu siitä, että komentorivillä on väärä argumentti.

  • Not enough memory
    Tämä virhe johtuu työtilan loppumisesta

  • Unable to execute command
    Tämä ilmoitus tulostuu komennon antamisen jälkeen. Se johtuu joko siitä, että tarvittavaa tiedostoa ei ole tai että sen nimi on kirjoitettu väärin.

  • Unable to open makefile
    Tämä ilmoitus johtuu siitä, että oletushakemistossa ei ole tarvittavaa komentotiedostoa.

Takaisin alkuun

Hakemisto

Ajonaikainen virhe
Askelluksen komennot
Call stack
Compile/Make
Debuggauksen aloitus
Evaluate /modify
Go to cursor
Jäljitysloukut
keskeytys
Keskeytysloukut
Käännösaikainen virhe
Looginen virhe
Merkkijonosyötteiden tarkastaminen
Numeeristen arvojen tarkastaminen
Output
Silmukka
Tarkistettavat asiat
Testausvirheet
Toggle Breakpoint
Versionhallintavirheet
Virhe
Virhetoiminto
Ympäristövirheet

Takaisin alkuun

Lähteet

Testitietokanta , testaussuunnitelma,
Tietojenkäsittelytieteen laitos, Joensuun yliopisto

Testaus,
Matti Pauna, Tietojenkäsittelytieteen laitos, Helsingin yliopisto

Department of Computing and Information Science,
Queens University, Ontario, Canada

Turbo Pascal -opas,
Tietoväylä, Jyväskylä, 1990

Johdatus tiedojenkäsittelyyn,
Täydennyskoulutuskeskus, Turun yliopisto, 1999

Pascal-ohjelmointi,
Jukka Selin - Paavo Jurvanen, KymData, 1994

Turbo Pascal -ohjelman help-valikko

Takaisin alkuun

Sanasto

AliohjelmaOhjelmassa oleva erikseen rajattu, itsenäinen kokonaisuus, joka on myös itsessään ohjelma ja voi palauttaa yhden tai useampia arvoja.

DebuggausOhjelmien virheiden jäljitys

ErikoismerkkiMuut merkit kuin numerot ja isot/pienet kirjaimet ascii-merkkitaulukossa.

Funktio Ohjelmassa oleva erikseen rajattu kokonaisuus, joka palauttaa yhden arvon pääohjelmaan.

JonoKirjaimista, numeroista, tyhjeistä ja/tai erikoismerkeistä koostuva kokonaisuus, jonka ohjelman käyttäjä syöttää ohjelman suorituksen aikana näppäimistöltä tai joka on valmiina muuttujan tai vakion arvona ohjelman aikana.

KääntäjäMuuttaa lähdekielisen tiedoston yhdellä kertaa ajokelpoiseksi, konekieliseksi tietokoneohjelmaksi.

LähdekieliTietylle ohjelmointikielelle tyypilliset sanat ja rakenteet.

MuuttujaTietokoneen muistista varattu alue, jolle annetaan tietty nimi. Muuttujaan voidaan tallentaa - ja sieltä voidaan lukea tietoa.

Muuttujan tunnusMuuttujalle annettu, yksilöivä nimi.

Ohjauskäsky Esityskielen rakenne, jolla voidaan vaikuttaa käskyjen (lauseiden) suoritusjärjestykseen.

OletusarvoVakion arvo tai muuttujan arvo, joka on ohjelman suorituksen alkaessa valmiina.

ParametriTietojen välittäjä pääohjelman ja aliohjelman /funktion välillä.

RekursioAliohjelma (proseduuri tai funktio) kutsuu itseään. Rekursio voi olla joko suora (aliohjelma kutsuu suoraan itseään) tai epäsuora (aliohjelma kutsuu toista aliohjelmaa ja tämä taas kutsuu ensimmäistä).

SemantiikkaMäärää, mitä kielen lauseet tarkoittavat.

SilmukkaOhjelman lauseet tapahtuvat sisäkkäisinä toistoina joko for-, while- tai repeat-until -toistorakenteiden avulla.

SyntaksiMäärää, millaisia ovat oikein muodostetut kielen lauseet.

TaulukkoindeksiTunniste, joka kertoo taulukon alkion sijainnin.

YlivuotoMuuttujaan sijoitettavan lausekkeen arvo ylittää muuttujan tyypin mukaisen arvo-alueen.

Takaisin alkuun

Tekijät

Jorma Hekkala
Jari Hintikka
Risto Joki-Korpela
Jaana Lukkarinen
Eeva Pölönen

Viimeistelty 3.12.1999

Takaisin alkuun