Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Muistivuodot C++

Sivun loppuun

Janne Kätevä [27.02.2008 15:56:35]

#

Onko olemassa mitään ilmaista ohjelmaa Windowsia ja MinGW:iä käyttävälle? Ohjelmalla pitäisi saada selville rivinumerot, jossa muistivuoto tapahtuu...

tesmu [27.02.2008 16:05:06]

#

MinGW:lle taitaa olla gdb...

Markus [27.02.2008 16:35:17]

#

gdb ei tietääkseni pysty tarkastamaan muistivuotoja. Se on vain debuggeri.

Sen sijaan muistivuotojen tarkastukseen on olemassa erittäin hyvä työkalu nimeltä: Valgrind. http://valgrind.org/

Se tulostaa ohjelman sammuttua listan kaikista muistivuodoista ja rivinumerot joissa vuoto tapahtuu.

Lisäksi se osaa tarkastaa ns. ylivuodot eli jos yrität kirjoittaa varatun muistialueen ulkopuolelle ja paljon muuta.

Edit:
Itse käytän tuota ohjelmaa Linuxilla ja en ole varma onko siitä Windows versiota.

Pekka Karjalainen [27.02.2008 17:21:40]

#

Tämä saattaisi olla käytännöllinen detektori MinGW:n kanssa käytettäväksi. MinGW:n sivuillakin on linkki tähän.

http://wyw.dcweb.cn/leakage.htm

(En ole itse kokeillut.)

tesmu [28.02.2008 01:39:31]

#

Markus kirjoitti:

gdb ei tietääkseni pysty tarkastamaan muistivuotoja. Se on vain debuggeri.

gdb:llä voit debugata että missä kohtaa muistivuoto tapahtuu...

Metabolix [28.02.2008 14:57:47]

#

tesmu kirjoitti:

gdb:llä voit debugata että missä kohtaa muistivuoto tapahtuu...

Nyt taitavat mennä termit sekaisin. Muistivuoto tarkoittaa sitä, että varattua muistia ei vapauteta. Se ei siis ole välittömään kaatumiseen johtava virhe. Debuggerilla sen sijaan on hyvä etsiä juuri noita kaatavia virheitä, joista tavallisimpia ovat ylivuodot ja ohi-indeksoinnit. Muistivuodon etsiminen GDB:llä ei nähdäkseni ole mielekästä, vaan parempi vaihtoehto on kirjoittaa oma new-operaattori.

Janne Kätevä [28.02.2008 23:22:53]

#

Kopeekka kirjoitti:

Tämä saattaisi olla käytännöllinen detektori MinGW:n kanssa käytettäväksi. MinGW:n sivuillakin on linkki tähän.

http://wyw.dcweb.cn/leakage.htm

(En ole itse kokeillut.)

Tuota olen kokeillut, mutta en saa sillä rivinumeroita näkymään ollenkaan.

Valgrind olisi muuten pätevä, mutta ei löydy versiota Windowsille...

os [01.03.2008 23:01:04]

#

Kysymys "millä rivillä ohjelma vuotaa muistia" on lähes verrattavissa yleiseen kysymykseen "millä rivillä ohjelma tekee jotain väärin", jos ohjelmassa on jotain vikana.

Muistivuotoja voi kuitenkin tutkia erikoisohjelmilla kuten Valgrind, joka ajaa ohjelman konekielistä koodia virtuaalikoneella (mikä tietenkin on todella hidasta) ja voi debug-symbolien avulla jopa selvittää millä rivillä jotakin menee selvästi pieleen.

Toinen vaihtoehto on debugata muistinhallintaa ohjelmallisesti omilla new- ja delete-operaattoreilla, mitä ilmeisesti myös tuo kokeilemasi ohjelma tekee. Pelkkät new- ja delete-operaattori eivät kuitenkaan riitä muistinkäsittelyvirheen tarkan paikan löytämiseksi vaan myös pointtereita täytyy kontrolloida jotenkin. Muistivuoto on sellainen tilanne, jossa varattuun, mutta ei vapautettuun muistialueeseen ei osoita enään yhtään pointteria. Tämä on mahdollista havaita vain omien pointterityyppien avulla, jolloin ratkaisu toimisi samalla tavalla kuin esimerkiksi boost::shared_ptr tai muiden ohjelmointikielten jätteenkerääjät. Ongelman ratkaiseminen on siis vaikeaa, mutta jos tuosta kokeilemastasi ohjelmasta tai jostakin muualta löydät systeemin, joka pystyy tähän, niin muistivuodon rivinumero saadaan yksinkertaisesti asettamalla debuggerin (GDB) breakpointti muistinhallintakoodin siihen kohtaan joka havaitsee muistivuodon.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta