Strumento di analisi dell'heap (dotnet-gcdump)
Questo articolo si applica a: ✔️ dotnet-gcdump
versione 3.1.57502 e versioni successive
Installare
Esistono due modi per scaricare e installare dotnet-gcdump
:
Strumento globale dotnet:
Per installare la versione più recente del
dotnet-gcdump
pacchetto NuGet, usare il comando dotnet tool install:dotnet tool install --global dotnet-gcdump
Download diretto:
Scaricare lo strumento eseguibile corrispondente alla piattaforma:
Sistema operativo Piattaforma Finestre x86 | x64 | Arm | Arm64 Linux x64 | Arm | Arm64 | musl-x64 | musl-Arm64
Nota
Per usare dotnet-gcdump
in un'app x86, è necessaria una versione x86 corrispondente dello strumento.
Riepilogo
dotnet-gcdump [-h|--help] [--version] <command>
Descrizione
Lo strumento globale dotnet-gcdump
raccoglie i dump GC (Garbage Collector) dei processi .NET live usando EventPipe. I dump GC vengono creati attivando un GC nel processo di destinazione, attivando eventi speciali e rigenerando il grafico delle radici degli oggetti dal flusso di eventi. Questo processo consente di raccogliere i dump GC durante l'esecuzione del processo e con un sovraccarico minimo. Questi dump sono utili per diversi scenari:
- Confronto tra il numero di oggetti nell'heap in diversi momenti.
- Analisi delle radici degli oggetti (risposta a domande come "che cosa ha ancora un riferimento a questo tipo?").
- Raccolta di statistiche generali sui conteggi degli oggetti nell'heap.
Visualizzazione del dump GC acquisito da dotnet-gcdump
In Windows i file .gcdump
possono essere visualizzati in PerfView per l'analisi o in Visual Studio. Attualmente, non c'è modo di aprire un .gcdump
su piattaforme non Windows.
Puoi raccogliere più .gcdump
e aprirli contemporaneamente in Visual Studio per ottenere un'esperienza di confronto.
Opzioni
--version
Visualizza la versione del servizio
dotnet-gcdump
.-h|--help
Mostra la Guida della riga di comando.
Comandi
Comando |
---|
dotnet-gcdump collect |
dotnet-gcdump ps |
report dotnet-gcdump |
dotnet-gcdump collect
Raccoglie un dump GC da un processo attualmente in esecuzione.
Avviso
Per eseguire l'heap GC, questo comando attiva un'operazione di Garbage Collection di seconda generazione (completa), che può sospendere il runtime per molto tempo, soprattutto quando l'heap GC è di grandi dimensioni. Non usare questo comando in ambienti sensibili alle prestazioni quando l'heap GC è di grandi dimensioni.
Riepilogo
dotnet-gcdump collect [-h|--help] [-p|--process-id <pid>] [-o|--output <gcdump-file-path>] [-v|--verbose] [-t|--timeout <timeout>] [-n|--name <name>]
Opzioni
-h|--help
Mostra la Guida della riga di comando.
-p|--process-id <pid>
ID processo da cui raccogliere il dump GC.
-o|--output <gcdump-file-path>
Percorso in cui devono essere scritti i dump GC raccolti. Il valore predefinito è .\YYYYMMDD_HHMMSS_<pid>.gcdump.
-v|--verbose
Generare l'output del log durante la raccolta del dump GC.
-t|--timeout <timeout>
Rinunciare alla raccolta del dump GC se richiede più di questo numero di secondi. Il valore predefinito è 30.
-n|--name <name>
Nome del processo da cui raccogliere il dump GC.
Nota
In Linux e macOS questo comando prevede che l'applicazione di destinazione e dotnet-gcdump
condividano la stessa variabile di ambiente TMPDIR
. In caso contrario, il comando raggiungerà il timeout.
Nota
Per raccogliere un dump GC utilizzando dotnet-gcdump
, è necessario che venga eseguito come stesso utente che esegue il processo target o come radice. In caso contrario, lo strumento non riuscirà a stabilire una connessione con il processo di destinazione.
dotnet-gcdump ps
Elenca i processi dotnet per cui è possibile raccogliere i dump GC. dotnet-gcdump 6.0.320703 e versioni successive mostrano anche gli argomenti della riga di comando con cui è stato avviato ogni processo, se disponibile.
Riepilogo
dotnet-gcdump ps [-h|--help]
Esempio
Si supponga di avviare un'app a esecuzione prolungata usando il comando dotnet run --configuration Release
. In un'altra finestra si esegue il comando dotnet-gcdump ps
. L'output visualizzato è il seguente. Gli argomenti della riga di comando, se presenti, vengono visualizzati usando la versione 6.0.320703 di dotnet-gcdump
e versioni successive.
> dotnet-gcdump ps
21932 dotnet C:\Program Files\dotnet\dotnet.exe run --configuration Release
36656 dotnet C:\Program Files\dotnet\dotnet.exe
dotnet-gcdump report <gcdump_filename>
Generare un report da un dump GC generato in precedenza o da un processo in esecuzione e scrivere in stdout
.
Riepilogo
dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]
Opzioni
-h|--help
Mostra la Guida della riga di comando.
-p|--process-id <pid>
ID processo da cui raccogliere il dump GC.
-t|--report-type <HeapStat>
Tipo di report da generare. Opzioni disponibili: heapstat (impostazione predefinita).
Risoluzione dei problemi
Nessuna informazione sul tipo in gcdump.
Prima di .NET Core 3.1, si verificava un problema per cui una cache dei tipi non veniva cancellata tra gcdumps quando venivano richiamati con EventPipe. Di conseguenza, gli eventi necessari per determinare le informazioni sul tipo non venivano inviate per il secondo gcdumps e i successivi. Questo problema è stato risolto in .NET Core 3.1-preview2.
I tipi COM e statici non sono inclusi nel dump GC.
Prima di .NET Core 3.1, si verificava un problema per cui i tipi statici e COM non venivano inviati quando il dump GC veniva richiamato tramite EventPipe. Questo problema è stato risolto in .NET Core 3.1.
dotnet-gcdump
non è in grado di generare un file.gcdump
a causa di informazioni mancanti, ad esempio [Errore] Eccezione durante gcdump: System.ApplicationException: il file ETL mostra l'inizio di un dump dell'heap, ma non il relativo completamento.. Oppure, il file.gcdump
non include l'intero heap.dotnet-gcdump
funziona raccogliendo una traccia degli eventi generati dal Garbage Collector durante una raccolta di generazione 2 indotta. Se l'heap è sufficientemente grande o non è disponibile memoria sufficiente per ridimensionare i buffer di eventi, gli eventi necessari per ricostruire il grafico dell'heap dalla traccia potrebbero essere eliminati. In questo caso, per diagnosticare i problemi con l'heap, è consigliabile raccogliere un dump del processo.dotnet-gcdump
sembra causare un problema di memoria insufficiente in un ambiente vincolato di memoria.dotnet-gcdump
funziona raccogliendo una traccia degli eventi generati dal Garbage Collector durante una raccolta di generazione 2 indotta. Il buffer per la raccolta di eventi è di proprietà dell'applicazione di destinazione e può aumentare fino a 256 MB.dotnet-gcdump
utilizza anche la memoria. Se l'ambiente è vincolato dalla memoria, assicurati di tenere conto di questi fattori durante la raccolta di un gcdump per evitare errori.