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:

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.