Haluaisin paikallistaa eräästä GTK+-ohjelmasta muistivuodon. Latasin koodin ja käänsin sen debug-symbolien avulla. Nyt voin ajaa ohjelmaa Nemmiverillä ja näen, mitä koodi tekee. Kuitenkaan en näe mitä tapahtuu, kun ohjelma kutsuu GTK+:n funktioita. Saako Nemiverillä tarkasteltua toisen paketin koodia? Lisäksi haluaisin tietää, miten muistivuotokohtaa kannattaa etsiä. Voinko esimerkiksi pyytää valgrindiä tutkimaan, vuotaako muistia ennen kuin pääohjelmassa edetään riville 650?
Kai olet käyttänyt Valgrindiä --leak-check=full
-option kanssa?
Jeps. Käytin sitä alkuperäiseen ohjelmaan, mutta sitä pitää ilmeisesti käyttää käännettyyn pakettiin vai kuinka? Toisaalta enpä tiedä auttaako se paikallistamaan vuotoa, kun se ei anna mitään vinkkiä siitä, missä kohtaa vuoto tapahtuu.
No kai se nyt aika hyviä vinkkejä antaa, jos sinulla on debug-symbolit mukana...
#include <stdlib.h> int main() { char * buf = malloc(100); return 0; }
gcc -g leak.c -o leak
[t]valgrind --leak-check=full ./leak[/t] kirjoitti:
...
==16398== 100 bytes in 1 blocks are definitely lost in loss record 1 of 1
==16398== at 0x4024C4C: malloc (vg_replace_malloc.c:195)
==16398== by 0x80483E0: main (leak.c:5)
...
Äh. No niinpäs näyttääkin. Mulla vaan näkyy Nemiverissä Geditin main.c ja eräs muistivuoto viittaa tiedostoon vg_replace_malloc.c. Mitenkähän saisin Nemiverin tarkastamaan tuota tiedostoa? Nemiverin käynnistin komennolla nemiver gedit ja tuo vg_replace_malloc.c ei näytä olevan edes samassa hakemistossa gediti.c:n kanssa.
http://valgrind.org/docs/manual/quick-start.html:
The stack trace tells you where the leaked memory was allocated. Memcheck cannot tell you why the memory leaked, unfortunately. (Ignore the "vg_replace_malloc.c", that's an implementation detail.)
Kannattaa katsoa siitä seuraavalta riviltä. (vrt. edellinen viestini)
Aihe on jo aika vanha, joten et voi enää vastata siihen.