Come tenere traccia / risolvere un problema relativo alla memoria in un grande codice C / C ++ su sistemi * nix


9

Quale strategia usi durante il monitoraggio di un problema relativo alla memoria? Quali strumenti usi (sia open source che proprietari) per identificare perdite di memoria, danneggiamento della memoria, ecc.? Come tracciare le perdite di memoria se solo un gdb / dbx fosse disponibile su un sistema?

Per me, riparare le perdite di memoria con solo un debugger è molto difficile.


2
Personalmente penso che questa domanda sia più legata alla programmazione che all'unix.
phunehehe,

Risposte:


12

Se puoi cambiare il codice sorgente, Dmalloc è fantastico; elencherà quali puntatori non erano disposti e (per il codice creato con simboli di debug) esattamente su quale linea erano allocati.

Se non ci riesci, Valgrind è praticamente lo standard per quel genere di cose. In genere trovo Valgrind un po 'più difficile da usare, ma ha molte più funzioni e non comporta l'aggiunta di chiamate dmalloc nel tuo codice


dmalloc non è molto performante come previsto in sistemi molto grandi. valgrind è una scommessa migliore, e anche lì

valgrind --tool memcheck "yourapp" fornirà informazioni relative alla memoria in fase di esecuzione (utile nei sistemi desktop). Un altro ottimo strumento è memwatch ma dovrebbe essere compilato insieme alla tua fonte. Memwatch può registrare i dettagli in un file, quindi più adatto ai sistemi incorporati.
rajaganesh87,


2

Il massiccio (da valgrind) è uno dei modi migliori per trovare perdite di memoria. Ripeti il ​​tuo codice sospetto (o esegui il programma abbastanza a lungo) e scarica il risultato con ms_print. Di solito, lo stack di chiamate ti fornisce informazioni sufficienti per risolverlo.

Con GDB, puoi provare a collegarti a un programma in esecuzione e chiamare funzioni come malloc_stats()

Se il tuo programma è scritto in un'altra lingua, potrebbe essere più complicato. Di recente, alcuni GDB hanno acquisito la possibilità di scrivere script e le persone hanno avviato progetti interessanti come gdb-heap , che può analizzare la memoria Python da un dump principale. Script di analisi della memoria simili potrebbero essere possibili per oggetti C ++.

Leggi anche /programming/2564752/examining-cc-heap-memory-statistics-in-gdb


1

Per Solaris, ci sono diversi strumenti elencati nelle risposte a questa domanda StackOverflow (includono il controllo delle perdite con altre forme di accesso alla memoria errato).


1

Faccio Objective-C da un po 'di tempo e c'è un analizzatore che si occupa della gestione della memoria di livello C e cose del genere. Clang Static Analyzer è così buono che Apple ha deciso di raggrupparlo con il suo IDE xCode. Non sono sicuro che questo sia utile per la tua domanda, ma se stai facendo C, vale la pena provare.


Minori cavilli: clang è stato sviluppato per l'uso in xcode fin dall'inizio. Vedi clang.llvm.org/clang_video-05-25-2007.html
Daniel James,

Ciao Daniel, potrebbe essere vero, ma non è stato incluso in xCode fino a poco tempo fa (o almeno non nel pacchetto che ho scaricato da Apple)
phunehehe,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.