FAQ:
How do i use DMalloc?
Answer:
- dmalloc installieren [zb im Home-Verzeichis]
- im Source Code des Programms inkludieren.
#include "dmalloc.h"
ACHTUNG! Muss an letzter Stelle der include Liste mit Gaensefuesschen stehen
- beim Kompilieren muessen folgende Optionen angegeben werden.
-object-files:
gcc -c -I/home/jochen/dmalloc/include tbdl.c -o tbdl.o,
-linker: Pfad und -ldmalloc damit die library tatsaechlich gelinkt wirdzb:
gcc -o tbdl -lm -ll -ly -L/home/jochen/dmalloc/lib $(OBJECTS) -ldmalloc"
ACHTUNG! -ldmalloc muss am ende stehen!
- ulimit auf unlimited setzen: ulimit -c unlimited
- DMALLOC_OPTIONS setzen
export DMALLOC_OPTIONS="debug=0x14e40583,inter=100,log=dmalloc.log"
- zu testendes programm aufrufen.
- in dmalloc.log stehen nicht 'befreite Speicher-Zellen' mit dazugehoerigen stack-adressen zb:
1004634525:1568:not freed: '0x807a8|s1' (12 bytes) from 'ra=0x190c0'
- eine stack adresse heraussuchen zb "addr=0x807a8|s1" und mit Hilfe des gdb den stack-frame anzeigen.
- dmalloc options erneut setzen, und zwar so, dass dmalloc genau an der stelle aus schritt 7 einen core-dump erzeugt, dh einen momentaufnahme des vom programm belegten speichers. zb:
export DMALLOC_OPTIONS='debug=0x14e40583,inter=100,log=dmalloc.log,addr=0x807a8:1'
ACHTUNG! aus "addr=0x807a8|s1" wird "addr=0x807a8:1"
- programm erneut starten.
- mit gdb core-file und programm oeffnen. zb: gdb ./tbdl core
- mit 'where' oder 'bt' den stack- frame anzeigen lassen.
das perl-programm memdebug.pl aus dem cdg-cvs-repositum automatisiert die schritte 5 bis 12.
Aufruf:
memdebug.pl 'programm-aufruf' <expliziter Pfad zum programm> > memdebug.log
zb:
memdebug.pl './tbdl -c train -d D M ../Corpus/mini.tt' $HOME/Path/To/Me/tbdl > memdebug.log
In der Datei
memdebug.log stehen anschliessend die stackframes der Stellen an denen Speicher alloziert wurde, jedoch nicht wieder freigegeben wurde.
Back to: CodingFAQ
--
JochenHagenstroem - 01 Nov 2001