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?
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?
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.
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()
È possibile utilizzare gli strumenti: deleaker (se si utilizza Windows). – MastAvalons
deleaker - strumento fantastico! Suporto memoria e perdite GDI, e.t. – z0r1fan
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.
È possibile cercare alcune implementazioni BSD di strumenti di gestione/profiling della memoria per esempi di codice. Ad esempio http://code.google.com/p/google-perftools/wiki/GooglePerformanceTools
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:
È 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.
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.
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.
http://stackoverflow.com/questions/1656227/how-does-valgrind-work – stephan
Si potrebbe provare il mio [heap debugger] (http://stackoverflow.com/questions/2835416/critique-my-non- intrusive-heap-debugger) per un inizio ;-) – fredoverflow
Non vorrei segnalarlo come duplicato, la domanda 'valgrind' è rilevante ma il" come implementare il mio "è nuovo. –