Domanda

Con quali rilevatori di perdite di memoria le persone hanno avuto una buona esperienza?

Ecco un riepilogo delle risposte finora:

Valgrind - Framework di strumentazione per la creazione di strumenti di analisi dinamica.

Recinto elettrico - Uno strumento che funziona con GDB

Stecca - Controllo statico leggero assistito da annotazioni

Codice bagliore - Si tratta di un profiler completo di prestazioni e memoria in tempo reale per programmatori Windows e .NET che sviluppano applicazioni con C++, C# o qualsiasi .NET Framework

Vedi anche questo post stackoverflow.

È stato utile?

Soluzione

secondo il valgrind...e aggiungo recinto elettrico.

Altri suggerimenti

Valgrind sotto Linux è abbastanza buono;Non ho esperienza sotto Windows con questo.

Se hai i soldi: IBM Rational Purify è un rilevatore di perdite di memoria e danneggiamento della memoria estremamente potente e potente nel settore per C/C++.Esiste per Windows, Solaris e Linux.Se utilizzi solo Linux e desideri una soluzione economica, scegli Valgrind.

Paraspruzzi per GCC!In realtà compila i controlli nell'eseguibile.Basta aggiungere

-fmudflap -lmudflap

ai tuoi flag gcc.

lint (strumento open source molto simile chiamato stecca)

Vale anche la pena usarlo se sei su Linux usando glibc è il codice heap di debug integrato.Per usarlo, collegarsi con -Controlla o definire (ed esportare) il file MALLOC_CHECK_ variabile di ambiente con il valore 1, 2 o 3. Il manuale glibc fornisce ulteriori informazioni.

Questa modalità è molto utile per rilevare i doppi liberi e spesso trova le scritture all'esterno dell'area di memoria allocata quando si esegue un libero.Non penso che segnali perdita di memoria.

Ho avuto parecchi successi con cppcheck, che esegue solo l'analisi statica.È open source e ha un'interfaccia a riga di comando (non l'ho usato in nessun altro modo).

Doloroso ma se dovessi usarne uno...
Consiglierei il Controllo dei limiti del partner di sviluppo suite..questo è ciò che le persone nel mio posto di lavoro usano per questo scopo.Pagato e di proprietà..non gratuito.

Ho avuto un amore minimo per qualsiasi rilevatore di perdite di memoria.In genere ci sono troppi falsi positivi perché possano essere di qualche utilità.Consiglierei questi due perché sono i meno invadenti:

GlowCode

Heap di debug

Per il debug Win32 delle perdite di memoria ho avuto ottime esperienze con il vecchio e semplice CRT Debug Heap, fornito come libreria con Visual C.

In una build di debug malloc (et al) viene ridefinito come _malloc_dbg (et al) e ci sono altre chiamate per recuperare i risultati, che sono tutti indefiniti se _DEBUG non è impostato.Imposta tutti i tipi di guardie di confine sull'heap e ti consente di visualizzare i risultati in qualsiasi momento.

Ho avuto alcuni falsi positivi mentre stavo sperimentando alcune routine temporali che hanno incasinato le allocazioni del tempo di esecuzione della libreria finché non ho scoperto _CRT_BLOCK.

Dovevo produrre prima il DOS, poi la console Win32 e servizi che funzionassero per sempre.Per quanto ne so non ci sono perdite di memoria e in almeno un punto il codice è stato eseguito per due anni incustodito prima che il monitor del PC si guastasse (anche se il PC andava bene!).

Su Windows, ho usato Rilevatore di perdite visivo.Si integra con VC++, facile da usare (basta includere un'intestazione e impostare LIB per trovare la libreria), open source, FTW gratuito.

All'università, quando facevo la maggior parte delle cose con Unix Solaris, usavo gdb.

Comunque andrei con valgrind sotto Linux.

Il nonno di questi strumenti è quello commerciale, a sorgente chiuso Purificare strumento, che fu venduto a IBM e poi a UNICOM

Quella di Parasoft Assicura++ (strumentazione del codice sorgente) e valgrind (open source) sono gli altri due veri concorrenti.

Curiosità:l'autore originale di Purify, Reed Hastings, ha poi fondato NetFlix.

Nessuno ha menzionato MSan di clang, che è abbastanza potente.Tuttavia, è ufficialmente supportato solo su Linux.

Questa domanda forse è vecchia, ma risponderò comunque: forse la mia risposta aiuterà qualcuno a trovare le proprie perdite di memoria.

Questo è il mio progetto: l'ho inserito come codice open source:

https://sourceforge.net/projects/diagnostic/

Sono supportate le piattaforme Windows a 32 e 64 bit, sono supportati gli stack di chiamate in modalità nativa e mista.

La raccolta dei rifiuti .NET non è supportata.(gcnew di C++ cli o nuovo di C#)

È uno strumento ad alte prestazioni e non richiede alcuna integrazione (a meno che tu non voglia davvero integrarlo).

Il manuale completo lo trovate qui:

http://diagnostic.sourceforge.net/index.html

Non aver paura di quante perdite effettivamente rileva nel tuo processo.Rileva perdite di memoria dall'intero processo.Analizza solo le fughe di notizie più grandi, non tutte.

Secondo Valgrind come strumento esterno per perdite di memoria.
Ma per la maggior parte dei problemi che ho dovuto risolvere ho sempre utilizzato strumenti costruiti internamente.A volte gli strumenti esterni comportano un sovraccarico eccessivo o sono troppo complicati da configurare.

Perché usare un codice già scritto quando puoi scriverne uno tuo :)

Scherzo, ma a volte hai bisogno di qualcosa di semplice ed è più veloce scrivertelo tu stesso.Di solito sostituisco le chiamate a Malloc () e Free () con funzioni che mantengono traccia migliore di chi alloca cosa.La maggior parte dei miei problemi sembra che qualcuno si sia dimenticato di liberare e questo aiuta a risolvere il problema.

Dipende davvero da dove si trova la perdita e, se lo sapessi, non avresti bisogno di alcuno strumento.Ma se hai qualche idea su dove pensi che ci sia una perdita, allora inserisci la tua strumentazione e vedi se ti aiuta.

Nostro CheckPointer lo strumento può farlo per GNU C 3/4 e, dialetti MS di C e GreenHills C.Può trovare problemi di gestione della memoria che Valgrind non può.

Se il tuo codice perde semplicemente, all'uscita CheckPointer ti dirà dove è stata allocata tutta la memoria non liberata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top