top of page

Author: Peter Meyer

 

Original Source: https://www.hermetic-systems.com/cfunlib/debug.htm

Debuggerin käyttö Visual C++

Virheenkorjaus on nimitys prosessille, jolla poistetaan virheitä tietokoneohjelmista. Sitä ei voida koskaan saattaa kokonaan päätökseen, koska "aina on yksi viimeinen vika". On kuitenkin mahdollista poistaa kaikki virheet paitsi tuo viimeinen. Tässä voidaan käyttää apuna virheenkorjausohjelmaa. Kyseessä on ohjelma, jonka avulla voit asteittain käydä läpi toisen ohjelman ohjeita ja tutkia ohjelman tilaa jokaisessa vaiheessa.


Virheenkorjaus alkaa heti, kun ihmettelet, miksi ohjelmasi ei tuota haluamiasi tuloksia. Ensimmäiseksi on varmistettava, että C/C++-koodisi kääntyy ja linkittyy virheettömästi. Jos virheilmoituksia tulee, koodia on muutettava niin, että virheitä ei tule.

Toiseksi on tutkittava koodia ja verrattava haluttuja tuloksia siihen, mitä todellisuudessa saadaan. Joskus käy kuitenkin niin, että koodin perusteellinen tarkastelu ei paljasta mitään virhettä. Silloin voit halutessasi lisätä virheenkorjauskoodia. Tämä voi koostua assert-lausekkeista, joilla varmistetaan, että muuttujilla on odotetut arvot ohjelman tietyissä kohdissa (esim. assert ( n > 0) ). Jos väittämät epäonnistuvat, ohjelma pysähtyy virheilmoitukseen.

Virheenkorjauskoodi voi myös koostua lausekkeista, joilla tulostetaan (käyttämällä printf- tai cout-lausekkeita) tiettyjen muuttujien arvot tietyissä kohdissa koodia, jotta saat tietoa siitä, mitä ohjelman suorituksen aikana tapahtuu. Jos tämä ei vieläkään valaise virhettä, on aika käynnistää virheenkorjausohjelma.

Mitä virheenkorjaaja voi tehdä

  • Käy läpi ohjelma yksi lauseke kerrallaan, joko "yli" tai "sisään" funktioita.

  • Suorita ohjelma tiettyyn pisteeseen asti (joko kursoriin tai "taukopisteeseen") ja pysäytä se sitten.

  • Näytä muuttujien arvot (tai sisällöt) kussakin kohdassa ohjelman suorituksen aikana.

Visual C++ -debuggerin käyttäminen

Tämä koskee Microsoft Visual C++ -kääntäjän versioita 5 ja 6.
Muiden versioiden debuggeri saattaa poiketa joiltakin osin.

Jotta voit käyttää debuggeria Visual C++ -ohjelmointiympäristössä, sinun on käännettävä ja linkitettävä ohjelmasi käyttämällä "Debug"-konfiguraatiota (ei "Release"-konfiguraatiota). Konfiguraatio asetetaan valikon valinnoilla Build | Set Active Configuration. Tämä on oletuskonfiguraatio, joten sinun ei tarvitse asettaa sitä, ellet ole aiemmin muuttanut konfiguraatiota "Release"-asetukseksi.

Yleensä ei ole hyödyllistä käydä ohjelman lausekkeita läpi aloittaen ensimmäisestä lausekkeesta main():ssa. On parempi, että ohjelma suoritetaan, kunnes se pääsee siihen koodin osaan, jossa luulet vian olevan. On kaksi tapaa käskeä debuggeria ajamaan tähän kohtaan. Voit asettaa kursorin kyseiseen kohtaan koodissa ja painaa Ctrl-F10 (tai käyttää Build | Start Debug | Run to Cursor). Debugger ajaa ohjelman, ja jos kaikki sujuu hyvin, se pysähtyy valitsemaasi kohtaan koodissasi ja debuggeri-ikkunat avautuvat. On tietysti mahdollista, että ohjelma päättyy ennen kuin aiottu pysähtymiskohta saavutetaan. Siinä tapauksessa valitse jokin aikaisempi kohta ohjelmassa.

Toinen tapa käskeä debuggeria ajamaan siihen kohtaan koodissasi, jonka haluat tutkia, on asettaa sinne "pysäytyspiste". Aseta taukopiste asettamalla kursori haluttuun kohtaan ja painamalla F9 (tai käyttämällä hiiren oikeanpuoleista painiketta | Insert/Remove Breakpoint). Jos taukopiste on asetettu, voit poistaa sen asettamalla kursorin sen viereen ja painamalla F9. (Taukopisteet voidaan myös poistaa käytöstä käyttämällä F9 tai hiiren oikeanpuoleista painiketta | Disable Breakpoint.) Kun olet asettanut taukopisteen, paina F5 (tai käytä Build | Start Debug | Go) saadaksesi debuggerin ajamaan ohjelman ja pysähtymään taukopisteeseen, minkä jälkeen debuggeri-ikkunat avataan (jos ne eivät ole jo auki).

Näytön vasemmassa ja oikeassa alareunassa olevissa ikkunoissa on muuttujien nimet ja arvot. Vasemmanpuoleisessa ikkunassa olevat muuttujat ovat sen funktion paikallisia muuttujia, jota parhaillaan suoritetaan. Oikeanpuoleisessa ikkunassa olevat muuttujat ovat käyttäjän määrittämiä muuttujia. Voit määrittää muuttujan napsauttamalla ensimmäisen tyhjän rivin vasenta osaa ja kirjoittamalla sitten muuttujan nimen. Kun painat Enter-näppäintä, kyseisen muuttujan arvo (jos sillä on arvo) näytetään. Tämän jälkeen voit tarkastella, miten näytettyjen muuttujien arvo muuttuu, kun ohjelman suorittamista jatketaan.

Painamalla F1-näppäintä saat esiin kontekstisidonnaisen ohjeen. Se kertoo esimerkiksi "Auto"-muuttujien ja "Locals"-muuttujien eron:

 

  • Automaattinen-välilehdellä näytetään tiedot muuttujista, joita on käytetty nykyisessä lausekkeessa ja edellisessä lausekkeessa.

  • Locals-välilehdellä näytetään tiedot muuttujista, jotka ovat paikallisia nykyiselle funktiolle.


Jos haluat tarkastella muuttujan arvoa kirjoittamatta muuttujan nimeä, aseta kursori johonkin muuttujan nimen kohdalle ja paina Shift-F9 (tai Debug | QuickWatch).

Voit jatkaa ohjelman suorittamista useilla eri tavoilla. Yksinkertaisin on painaa F10 (tai Debug | Step Over), jolloin suoritetaan seuraava lauseke (joka näkyy pienellä keltaisella nuolella koodiikkunan vasemmassa reunassa). F10-näppäimen painaminen toistuvasti astuu peräkkäisten ohjelmalausekkeiden läpi. Kiinnitä huomiota alaikkunoissa annettuihin tietoihin. Jos olet esimerkiksi lausekkeessa

if ( ( j = atoi(buffer) ) >= 2000 )

(joka muuntaa puskurissa olevan merkkijonon kokonaisluvuksi, sijoittaa arvon muuttujaan j ja vertaa sitä arvoon 2000), niin painettuasi F10 saat tiedon atoi():n palauttamasta arvosta.

Jos olet funktiokutsun kohdalla, F10 saa aikaan kyseisen funktion suorittamisen, ja kun debuggeri palauttaa kontrollin, olet seuraavan lausekkeen kohdalla. Funktion kutsun kohdalla voit painaa F11 (tai Debug | Step Into) siirtyäksesi kyseiseen funktioon (jos kyseisen funktion koodi on käännetty Debug-tilassa). Voit sitten käyttää F10-näppäintä siirtyäksesi kyseisen funktion lausekkeiden läpi. Kun olet funktion sisällä, voit painaa Shift-F11 (tai Debug | Step Out), jolloin voit käydä läpi loput funktiosta ja palata kohtaan, jossa funktiota kutsuttiin.

Kun debuggeri käynnistyy, se avaa ikkunan ohjelman ulostuloa varten, joten voit vaihtaa debuggerin ja tämän ikkunan välillä nähdäksesi, mitä ohjelma lähettää näytölle.

F10:n, F11:n ja Shift-F11:n lisäksi voit käyttää Ctrl-F10:tä (tai Debug | Suorita kursoriin) ajaaksesi kursorin sijaintiin. Voit myös asettaa muita taukopisteitä ja käyttää F5:tä (tai Debug | Siirry) kulkeaksesi jokaiseen niistä vuorollaan. Sinulla voi olla useita taukopisteitä aktiivisena, ja voit poistaa ne käytöstä tai poistaa ne halutessasi asettamalla kursorin niiden kohdalle ja painamalla F9.

Jos haluat nähdä muuttujan määritelmän, aseta kursori muuttujan nimen kohdalle ja käytä hiiren oikeanpuoleista painiketta | Siirry määritelmään. Voi käydä niin, että debuggeri ilmoittaa, että se ei voi tehdä tätä ennen kuin se on luonut Browser-tietokannan, jolloin käske sitä tekemään niin.

Selain on hyödyllinen työkalu, jonka avulla voit hakea minkä tahansa ohjelmassasi olevan muuttujan määritelmän ja paikat ohjelmassasi, joissa kyseistä muuttujaa käytetään ("muuttujaviittaukset"). Voit käyttää sitä valitsemalla Tools | Source Browser.

Jos ohjelmasi käyttää komentoriviargumentteja, voit asettaa ne debuggauksen aikana valitsemalla Project | Settings | Debug | Program arguments.

Voit käynnistää ohjelman alusta painamalla Ctrl-Shift-F5 (tai Debug | Restart). 

Voit pysäyttää debuggerin ja palata muokkaustilaan käyttämällä Shift-F5 (tai Debug | Stop Debugging).

F5 Käynnistää ohjelman suorituksen, kunnes taukopiste saavutetaan.
Shift-F5 Lopeta virheenkorjaus ja palaa ohjelman muokkaustilaan.
Ctrl-Shift-F5 Käynnistä ohjelma uudelleen debuggaustilassa.
F9 Aseta taukopiste, poista se käytöstä tai poista se.
Shift-F9 Hae muuttujan arvo.
F10 Suorita nykyinen lauseke tai funktiokutsu.
Ctrl-F10 Suorita ohjelma siihen kohtaan, jossa kursori on.
F11 Jos nykyinen lauseke on funktiokutsu, siirry funktioon.
Shift-F11 Jos suoritetaan funktio, aja loppuun ja palaa kutsuvaan lausekkeeseen.

bottom of page