Valgrind
valgrind | |
---|---|
Käyttöliittymä | teksti |
Lisenssi | GPL |
Kotisivu | valgrind.org |
Valgrind on helppokäyttöinen ja hyödyllinen muistidebuggaus- ja profilointityökalu.
Käyttö
Valgrind käynnistetään kuten Gdb
valgrind ./ohjelma
Tämän jälkeen valgrind tulostaa, oletuksena standarditulostusvirtaan, mm. hyödyllistä tietoa ohjelman muistinkäytön puutteista, jos niitä on.
Tulosteen tulkinta
Valgrindin tulostamien rivien alussaoleva ==PID== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää.
tool=memcheck
==12799== Invalid read of size 4
Edellinen merkintä kertoo, että muistista on luettu alue standardikirjastolta varattujen muistialueiden ulkopuolelta. "of size 4" kertoo tässä, että alue on 4 size_t -yksikön kokoinen, eli tyypillisesti 4 tavua, 32-bittiä. Tämä on ehdottomasti virhe, tarkista esimerkiksi taulukoiden indeksoinnit. Merkinnän jälkeen tulostuu kutsupino, joka kertoo, missä virhe tapahtuu. Esimerkiksi:
==12393== at 0x80483FA: main (testi.c:7)
kertoo, että virhe tapahtuu suoritettavan ohjelman kohdassa 0x80483FA, funktiossa main(), lähdekooditiedostossa testi.c ja rivillä 7.
==16340== Address 0x416702D is 1 bytes after a block of size 4 alloc'd
Kertoo luetun muistiosoitteen ja hyödyllistä tietoa sen sijainnista suhteessa varattuun muistiin.
==17298== Invalid write of size 1
Merkintä kertoo, että muistiin on kirjoitettu alue varattujen muistialueiden ulkopuolelta. Tulkinta on lähes täysin vastaava edelliseen nähden.
==18096== Conditional jump or move depends on uninitialised value(s)
Tämä virhe syntyy, kun koodissa on käytetty if, for tai while -ohjauslausekkeiden ehtona muuttujaa, jonka muistialue on alustamaton tai jonka muistialueen sisältö ei ole määräytynyt täsmällisesti ohjelman ajon aikana.
Tässä vikana voi olla esimerkiksi unohtunut = NULL -sijoitus olemattomalle oliolle, kun olion ja NULL:n vertailua käytetään ehtona olion käsittelylle. Kannattaa kuitenkin välttää logiikkavirheiden peittämistä mielivaltaisella alustamisella!