Condividi tramite


Strumento di analisi dell'heap (dotnet-gcdump)

Questo articolo si applica a: ✔️ dotnet-gcdump versione 10.0 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>] [--dsrouter <ios|ios-sim|android|android-emu>]

Opzioni

  • -h|--help

    Mostra la Guida della riga di comando.

  • -p|--process-id <pid>

    ID processo da cui raccogliere il dump GC.

    Nota

    In Linux e macOS, l'uso di questa opzione richiede l'applicazione di destinazione e dotnet-gcdump condividere la stessa TMPDIR variabile di ambiente. In caso contrario, il comando raggiungerà il timeout.

  • -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, l'uso di questa opzione richiede l'applicazione di destinazione e dotnet-gcdump condividere la stessa TMPDIR variabile di ambiente. In caso contrario, il comando raggiungerà il timeout.

  • --diagnostic-port <port-address[,(listen|connect)]>

    Imposta la porta di diagnostica utilizzata per comunicare con il processo di cui eseguire il dump. dotnet-gcdump e il runtime .NET all'interno del processo di destinazione devono accettare l'indirizzo della porta, con uno in ascolto e l'altro connesso. dotnet-gcdump determina automaticamente la porta corretta durante il collegamento tramite le --process-id opzioni o --name . In genere è necessario specificare la porta in modo esplicito quando si comunica con un processo in esecuzione all'interno di un contenitore che non fa parte dello spazio dei nomi del processo corrente.

    Il valore port-address è diverso dal sistema operativo:

    • Linux e macOS: percorso di un socket di dominio Unix, /foo/tool1.socketad esempio .
    • Windows: percorso di una named pipe, \\.\pipe\my_diag_port1ad esempio .
    • Android, iOS e tvOS: una porta IP, ad esempio 127.0.0.1:9000.

    Per impostazione predefinita, dotnet-gcdump rimane in ascolto nell'indirizzo specificato. È possibile richiedere a dotnet-gcdump di connettersi aggiungendo ,connect invece dopo l'indirizzo. Ad esempio, --diagnostic-port /foo/tool1.socket,connect si connetterà a un processo di runtime .NET in ascolto del socket di /foo/tool1.socket dominio Unix.

  • '--dsrouter {ios|ios-sim|android|android-emu}

    Avvia dotnet-dsrouter e si connette a esso. Richiede l'installazione di dotnet-dsrouter . Eseguire dotnet-dsrouter -h per altre informazioni.

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.