Muokataan sivua Valgrind
Siirry navigaatioon
Siirry hakuun
Kumoaminen voidaan suorittaa. Varmista alla olevasta vertailusta, että haluat saada aikaan tämän lopputuloksen, ja sen jälkeen julkaise alla näkyvät muutokset.
Nykyinen versio | Oma tekstisi | ||
Rivi 1: | Rivi 1: | ||
{{Ohjelma | {{ Ohjelma | nimi=valgrind | kuva= | kuvateksti= | lisenssi=[[GPL]]| käyttöliittymä=teksti | kotisivu=[http://valgrind.org valgrind.org] }} | ||
| nimi= | |||
| kuva= | |||
| kuvateksti= | |||
| lisenssi=[[GPL]] | |||
| käyttöliittymä=teksti | |||
| kotisivu=[http://valgrind.org valgrind.org] | |||
}} | |||
Valgrind on helppokäyttöinen ja hyödyllinen muistidebuggaus- ja profilointityökalu linuxille, joka tukee x86, AMD64, ppc ja ppc64 -prosessorityyppejä. | |||
== Käyttö == | == Käyttö == | ||
Rivi 18: | Rivi 8: | ||
valgrind ./ohjelma | valgrind ./ohjelma | ||
Tämän jälkeen | Tämän jälkeen valgrind tulostaa, oletuksena standarditulostusvirtaan, mm. hyödyllistä tietoa ohjelman muistinkäytön puutteista, jos niitä on. | ||
== Tulosteen tulkinta == | == Tulosteen tulkinta == | ||
Rivi 36: | Rivi 14: | ||
Valgrindin tulostamien rivien alussaoleva ==[[PID]]== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. | Valgrindin tulostamien rivien alussaoleva ==[[PID]]== kertoo senhetkisen ajettavan prosessin prosessitunnuksen. | ||
Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää. | Ohjelman oma tuloste taas tulostuu sellaisenaan ilman tätä merkintää. | ||
===tool=memcheck=== | ===tool=memcheck=== | ||
==12799== Invalid read of size 4 | ==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ä | 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: | Merkinnän jälkeen tulostuu kutsupino, joka kertoo, missä virhe tapahtuu. Esimerkiksi: | ||
==12393== at 0x80483FA: main (testi.c:7) | ==12393== at 0x80483FA: main (testi.c:7) | ||
kertoo, että virhe tapahtuu suoritettavan ohjelman kohdassa 0x80483FA, funktiossa | 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 | ==16340== Address 0x416702D is 1 bytes after a block of size 4 alloc'd | ||
Rivi 52: | Rivi 31: | ||
==18096== Conditional jump or move depends on uninitialised value(s) | ==18096== Conditional jump or move depends on uninitialised value(s) | ||
Tämä virhe syntyy, kun koodissa on käytetty if | 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 | 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! | ||
=== | ===yhteenveto ohjelman muistinkäytöstä=== | ||
==8843== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 7 from 1) | ==8843== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 7 from 1) | ||
Rivi 65: | Rivi 44: | ||
==8843== checked 53,100 bytes. | ==8843== checked 53,100 bytes. | ||
Käyttämällä valitsinta | |||
Käyttämällä valitsinta --leak-check=full saadaan tietoa menetetystä muistista: | |||
==8843== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 | ==8843== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 | ||
Rivi 85: | Rivi 65: | ||
"definitely lost" kertoo, että muistialueen käsittely voidaan varmasti tulkita muistivuodoksi. | "definitely lost" kertoo, että muistialueen käsittely voidaan varmasti tulkita muistivuodoksi. | ||
"possibly lost" kertoo, että muistialueen käsittely | "possibly lost" kertoo, että muistialueen käsittely on luultavasti tulkita muistivuodoksi. | ||
"still reachable" kertoo, että varattuun muistialueeseen on säilytetti viittaus ohjelman loppuun asti, mutta sitä ei vapauteta ennen ohjelma päättymistä. Tunnetusti C++:n standardikirjastojen templaattisäilöt eivät vapauta muistia välttämättä käskettäessäkään, vaan säilyttävät varauksen, jotta alue voitaisiin ottaa tarvittaessa uudelleen käyttöön. Tästä ei siis tarvitse välttämättä C++-ohjelmissa huolestua. |