DHAT - Strumento Dinamico di Analisi Heap
DHAT - Strumento Dinamico di Analisi Heap Cheatsheet
DHAT (Dynamic Heap Analysis Tool) è un tool Valgrind che risponde a una domanda diversa dalla maggior parte dei profiler di memoria. Invece di solo “quanta memoria hai allocato”, riporta come quella memoria è stata effettivamente usata: blocchi che sono stati allocati ma mai letti, blocchi scritti una volta e mai più toccati, allocazioni molto brevi, e allocazioni molto più grandi dei byte effettivamente acceduti. Quella vista di uso spesso rivela spreco che i profiler basati solo su dimensione non possono vedere.
Installazione
| Piattaforma | Comando |
|---|---|
| Debian/Ubuntu | sudo apt install valgrind |
| Fedora/RHEL | sudo dnf install valgrind |
| Arch Linux | sudo pacman -S valgrind |
| macOS | supporto limitato; preferisci Linux |
| Verifica | valgrind --tool=dhat --version |
Costruisci il tuo programma con
-gper utili stack trace. DHAT viene eseguito sotto Valgrind, quindi aspettati un rallentamento significativo — questo è uno strumento di analisi, non un profiler di produzione.
Esecuzione di DHAT
valgrind --tool=dhat ./my-program
# → produce dhat.out.<pid>
| Opzione | Scopo |
|---|---|
--dhat-out-file=FILE | Percorso di output |
--mode=heap | Profiling heap predefinito |
--mode=copy | Profila copia di memoria (memcpy ecc.) |
--mode=ad-hoc | Punti di strumentazione personalizzati |
--num-callers=N | Profondità dello stack nei report |
Visualizzazione dei Risultati
L”output di DHAT è JSON, visualizzato nel viewer HTML fornito:
# Apri il viewer e carica dhat.out.<pid>
firefox /usr/libexec/valgrind/dh_view.html
| Elemento dell”UI | Mostra |
|---|---|
| Albero dei punti di allocazione | Raggruppato per stack di chiamate |
| Byte totali / max | Volume per sito |
| Letture / scritture | Quanto la memoria è stata effettivamente acceduta |
| Lifetime | Quanto a lungo i blocchi sono rimasti vivi |
| Ordinamento | Per qualsiasi metrica per trovare i peggiori trasgressori |
Le Metriche Che Contano
| Metrica | Rivela |
|---|---|
| Byte totali | Volume di allocazione complessivo da questo sito |
| Byte max | Uso simultaneo di picco |
| Letture / scritture | Intensità di accesso |
| Letture = 0 | Allocato ma mai letto — spreco puro |
| Scritture = 0 | Mai inizializzato — probabilmente un bug o spreco |
| Lifetime brevi | Churn; candidati per stack/pooling |
| Rapporto di accesso | Byte acceduti vs byte allocati |
Il caso “reads = 0” è il classico trovato di DHAT: memoria che un programma diligentemente alloca, riempie e libera senza che nulla mai la legga.
Risultati Comuni e Fix
| Risultato | Fix Probabile |
|---|---|
| Molte allocazioni piccole brevi | Allocazione su stack, arena o object pool |
| Blocco grande, porzione acceduta piccola | Alloca solo quello che usi; caricamento lazy |
| Allocazioni mai lette | Elimina il lavoro interamente |
| Alloc/free ripetuti della stessa dimensione | Riusa un buffer |
| Container sovradimensionati | Riserva capacità accurata |
Modalità Copia
valgrind --tool=dhat --mode=copy ./my-program
La modalità copia profila il volume di memcpy/memmove per sito di chiamata — utile quando il profiling mostra tempo in copia e hai bisogno di sapere quale codice è responsabile.
Modalità Ad-Hoc
La modalità ad-hoc ti consente di contare eventi arbitrari annotando il tuo codice con richieste di client DHAT, trasformando DHAT in un contatore generale “quale stack di chiamate fa di più questo”.
DHAT vs Tool Correlati
| Aspetto | DHAT | massif | heaptrack | Bytehound |
|---|---|---|---|---|
| Focus | Come la memoria è usata | Uso di picco nel tempo | Profiling di allocazione | Esplorazione interattiva |
| Overhead | Alto (Valgrind) | Alto (Valgrind) | Basso | Basso |
| Insight unico | Blocchi non letti/sottoutilizzati | Snapshot di picco | Churn + leak | Filtrazione ricca |
| Migliore per | Trovare lavoro sprecato | Riduzione di picco | Esecuzioni veloci e realistiche | Analisi interattiva profonda |
Usa heaptrack o Bytehound per profiling a basso overhead di esecuzioni realistiche; ricorri a DHAT quando vuoi sapere se la memoria allocata è stata effettivamente usata.