Vorrei pubblicizzare la mia utility heaptrack appena annunciata, che dovrebbe essere proprio quello che stavi cercando allora. Puoi trovare maggiori informazioni qui:http://milianw.de/blog/heaptrack-a-heap-memory-profiler-for-linux
Rispetto al tuo strumento heapwatch, le prestazioni dovrebbero essere di gran lunga migliori, poiché utilizzo libunwind e successivamente libbacktrace per ritardare l'annotazione del backtrace con le informazioni di debug di DWARF.
Mi piacerebbe ricevere più feedback in merito, quindi provalo!
memleax dovrebbe funzionare per te.
Esegue il debug della perdita di memoria di un processo in esecuzione allegandolo, senza ricompilare il programma o riavviare il processo di destinazione. È molto comodo e adatto all'ambiente di produzione.
Esegue il TRAP solo per le chiamate malloc/free(), quindi dovrebbe avere un impatto sulle prestazioni inferiore rispetto a Vagrild.
Funziona su GNU/Linux-x86_64 e FreeBSD-amd64.
NOTA:sono l'autore, ogni suggerimento è ben accetto
GNU libc ha il debug malloc integrato:
http://www.gnu.org/software/libc/manual/html_node/Allocation-Debugging.html
Usa LD_PRELOAD per chiamare mtrace()
dal tuo .so:
#include <mcheck.h>
static void prepare(void) __attribute__((constructor));
static void prepare(void)
{
mtrace();
}
Compilalo con:
gcc -shared -fPIC dbg.c -o dbg.so
Eseguilo con:
export MALLOC_TRACE=out.txt
LD_PRELOAD=./dbg.so ./my-leaky-program
Successivamente ispeziona il file di output:
mtrace ./my-leaky-program out.txt
E otterrai qualcosa come:
Memory not freed:
-----------------
Address Size Caller
0x0000000001bda460 0x96 at /tmp/test/src/test.c:7
Ovviamente, sentiti libero di scrivere i tuoi hook malloc che scaricano l'intero stack (chiamando backtrace() se pensi che possa essere d'aiuto).
I numeri di riga e/o i nomi delle funzioni saranno ottenibili se hai mantenuto le informazioni di debug per il binario da qualche parte (ad es. il binario ha alcune informazioni di debug integrate o hai fatto objcopy --only-keep-debug my-leaky-program my-leaky-program.debug
).
Inoltre, potresti provare il GC di Boehm, funziona anche come rilevatore di perdite:
http://www.hpl.hp.com/personal/Hans_Boehm/gc/leak.html