2010-05-18 3 views
10

Come funzionano gli strumenti di rilevamento perdite di memoria come purify e valgrind?Strumento per il rilevamento di perdite di memoria

Come posso progettare e implementare il mio strumento?

+1

http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan

+1

Si potrebbe provare il mio [heap debugger] (http://stackoverflow.com/questions/2835416/critique-my-non- intrusive-heap-debugger) per un inizio ;-) – fredoverflow

+0

Non vorrei segnalarlo come duplicato, la domanda 'valgrind' è rilevante ma il" come implementare il mio "è nuovo. –

risposta

5

Per il rilevamento di perdite di base è sufficiente agganciarsi a routine di allocazione di memoria di basso livello, ad es. rattoppando malloc/free. Successivamente, traccia tutte le assegnazioni e successivamente segnala quelle che non sono state liberate in un punto appropriato, ad es. appena prima di uscire.

8

Tali strumenti di solito strumento l'exeutable con il proprio codice. per esempio sostituiscono ogni chiamata a malloc() e free() con le proprie funzioni che consente loro di seguire ogni allocazione.

In Visual Studio questo può essere fatto automaticamente utilizzando solo la libreria di runtime C utilizzando le funzioni della famiglia di _CrtDumpMemoryLeaks()

+2

È possibile utilizzare gli strumenti: deleaker (se si utilizza Windows). – MastAvalons

+2

deleaker - strumento fantastico! Suporto memoria e perdite GDI, e.t. – z0r1fan

3

Per il lavoro vero e proprio, valgrind funziona abbastanza bene. Rileva le perdite di lettura/scrittura e di memoria non valide.

Per il progetto hobby, è possibile creare il proprio modulo di gestione della memoria che tiene traccia della diversa allocazione del puntatore e del suo utilizzo. Se non si vede la posizione di mem usata per molto tempo, potrebbe essere una perdita.

1

Sto sviluppando questo strumento: Deleaker.

Certo, l'idea ovvia è di agganciare tutte le funzioni che eseguono allocazioni e deallocazioni. Questo non è solo malloc e gratuito, piuttosto HeapAlloc/HeapFree (se parliamo di piattaforma Windows) perché le moderne versioni VC++ (dopo VC 6.0) semplicemente reindirizzano malloc/free a HeapAlloc/HeapFree di winapi.

Per ogni assegnazione viene salvato uno stack e viene salvato un oggetto. Su ogni deallocazione l'oggetto viene liberato. A prima vista, è così semplice: basta memorizzare un elenco di oggetti allocati e rimuovere un oggetto sul gancio di deallocazione.

ma ci sono parti difficili:

  • velocità

È necessario mantenere una lista di oggetti allocati. Se aggiungete/rimuovete un oggetto in ogni funzione uncinata, il processo sta eseguendo troppo tempo. Questo sembra essere un problema comune a questi strumenti.

  • Stack Trace

Utilizzando dbghelp.dll funzione per ottenere stack trace prende un sacco di tempo. È necessario ottenere le voci dello stack più velocemente: ad esempio, mediante la lettura manuale della memoria del processo.

  • falsi positivi

Alcune perdite sono prodotte da DLL di sistema. Se li mostri tutti, hai un sacco di perdite, ma l'utente non può "risolverlo": non ha accesso al suo codice sorgente e non può impedire l'esecuzione di questo codice.È impossibile fermare questa fuga. Alcuni di essi sono allocazioni singole al punto di ingresso di una DLL di sistema, quindi non è una vera perdita (una buona domanda, qual è la perdita?). Come riconoscere quelle perdite che devono essere mostrate? Un buon filtraggio è una risposta.

Spero che questo aiuti.