Onko olemassa mitään ilmaista ohjelmaa Windowsia ja MinGW:iä käyttävälle? Ohjelmalla pitäisi saada selville rivinumerot, jossa muistivuoto tapahtuu...
MinGW:lle taitaa olla gdb...
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.
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.)
Markus kirjoitti:
gdb ei tietääkseni pysty tarkastamaan muistivuotoja. Se on vain debuggeri.
gdb:llä voit debugata että missä kohtaa muistivuoto tapahtuu...
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.
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...
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.