Partilhar via


Ferramenta de análise de heap (dotnet-gcdump)

Este artigo aplica-se a: ✔️ dotnet-gcdump versão 10.0 e versões posteriores

Instalar

Há duas maneiras de baixar e instalar dotnet-gcdump:

  • Ferramenta global dotnet:

    Para instalar a versão mais recente do dotnet-gcdumppacote NuGet, use o comando dotnet tool install :

    dotnet tool install --global dotnet-gcdump
    
  • Download direto:

    Faça o download do executável da ferramenta que corresponde à sua plataforma:

    SO Plataforma
    Mac OS
    Aplicações Linux x64 | Braço | Arm64 | musl-x64 | musl-Arm64

Nota

Para usar dotnet-gcdump em um aplicativo x86, você precisa de uma versão x86 correspondente da ferramenta.

Sinopse

dotnet-gcdump [-h|--help] [--version] <command>

Descrição

A dotnet-gcdump ferramenta global coleta despejos GC (Garbage Collector) de processos .NET em tempo real usando o EventPipe. Os dumps de GC são criados acionando um GC no processo de destino, ativando eventos especiais e regenerando o gráfico de raízes de objeto do fluxo de eventos. Esse processo permite que os despejos de GC sejam coletados enquanto o processo está em execução e com sobrecarga mínima. Esses despejos são úteis para vários cenários:

  • Comparando o número de objetos na pilha em vários pontos no tempo.
  • Analisar raízes de objetos (respondendo a perguntas como, "o que ainda tem uma referência a este tipo?").
  • Coleta de estatísticas gerais sobre as contagens de objetos na pilha.

Visualize o despejo GC capturado de dotnet-gcdump

No Windows, .gcdump os arquivos podem ser exibidos no PerfView para análise ou no Visual Studio. Atualmente, não há como abrir um .gcdump em plataformas não-Windows.

Você pode coletar vários .gcdumps e abri-los simultaneamente no Visual Studio para obter uma experiência de comparação.

Opções

  • --version

    Exibe a versão do dotnet-gcdump utilitário.

  • -h|--help

    Mostra a ajuda da linha de comando.

Comandos

Comando
dotnet-gcdump coletar
dotnet-gcdump PS
Relatório dotnet-gcdump

dotnet-gcdump collect

Coleta um despejo GC de um processo em execução no momento.

Aviso

Para percorrer o heap GC, este comando dispara uma coleta de lixo de geração 2 (completa), que pode suspender o tempo de execução por um longo tempo, especialmente quando o heap GC é grande. Não use esse comando em ambientes sensíveis ao desempenho quando o heap GC for grande.

Sinopse

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>]

Opções

  • -h|--help

    Mostra a ajuda da linha de comando.

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

    A ID do processo a partir da qual coletar o despejo GC.

    Nota

    No Linux e macOS, usar essa opção requer o aplicativo de destino e dotnet-gcdump compartilhar a mesma TMPDIR variável de ambiente. Caso contrário, o comando atingirá o tempo limite.

  • -o|--output <gcdump-file-path>

    O caminho onde os despejos GC coletados devem ser gravados. O padrão é .\YYYYMMDD_HHMMSS_<pid.gcdump>.

  • -v|--verbose

    Saída do log enquanto coleta o despejo GC.

  • -t|--timeout <timeout>

    Desista de coletar o despejo de GC se demorar mais do que esses muitos segundos. O valor predefinido é 30.

  • -n|--name <name>

    O nome do processo para coletar o despejo GC.

    Nota

    No Linux e macOS, usar essa opção requer o aplicativo de destino e dotnet-gcdump compartilhar a mesma TMPDIR variável de ambiente. Caso contrário, o comando atingirá o tempo limite.

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

    Define a porta de diagnóstico usada para se comunicar com o processo a ser despejado. dotnet-gcdump e o tempo de execução do .NET dentro do processo de destino devem concordar com o endereço da porta, com um ouvindo e o outro se conectando. dotnet-gcdump determina automaticamente a porta correta ao anexar usando as --process-id opções OR --name . Normalmente, só é necessário especificar a porta explicitamente ao se comunicar com um processo que está sendo executado dentro de um contêiner que não faz parte do namespace do processo atual.

    O port-address difere por SO:

    • Linux e macOS - um caminho para um soquete de domínio Unix como /foo/tool1.socket.
    • Windows - um caminho para um pipe nomeado, como \\.\pipe\my_diag_port1.
    • Android, iOS e tvOS - uma porta IP:, como 127.0.0.1:9000.

    Por padrão, dotnet-gcdump escuta no endereço especificado. Em vez disso, você pode solicitar que dotnet-gcdump se conecte, anexando ,connect após o endereço. Por exemplo, --diagnostic-port /foo/tool1.socket,connect se conectará a um processo de tempo de execução .NET que está ouvindo o soquete de /foo/tool1.socket domínio Unix.

  • --dsrouter <ios|ios-sim|android|android-emu>

    Inicia dotnet-dsrouter e se conecta a ele. Requer dotnet-dsrouter para ser instalado. Corra dotnet-dsrouter -h para obter mais informações.

Nota

Para coletar um despejo GC usando dotnet-gcdumpo , ele precisa ser executado como o mesmo usuário que o usuário que executa o processo de destino ou como root. Caso contrário, a ferramenta não conseguirá estabelecer uma conexão com o processo de destino.

Examples

  • Recolha um dump GC de um processo com ID de processo 1902:

    > dotnet-gcdump collect --process-id 1902
    Writing gcdump to './20250601_121500_1902.gcdump'...
        Finished writing 5763432 bytes.
    
  • Recolha um dump GC de um processo com ID de processo 1902 e guarde-o num caminho personalizado:

    > dotnet-gcdump collect --process-id 1902 --output ./myapp-dump.gcdump
    Writing gcdump to './myapp-dump.gcdump'...
        Finished writing 5763432 bytes.
    
  • Recolha um dump GC de um processo pelo nome com saída detalhada:

    > dotnet-gcdump collect --name my-aspnet-server --verbose
    [20:54:11] Starting gcdump collection...
    [20:54:11] Triggering GC...
    [20:54:12] Writing gcdump to './20250601_205412_4521.gcdump'...
        Finished writing 5763432 bytes.
    
  • Recolha um dump GC com um timeout personalizado de 60 segundos:

    > dotnet-gcdump collect --process-id 1902 --timeout 60
    Writing gcdump to './20250601_121500_1902.gcdump'...
        Finished writing 5763432 bytes.
    

dotnet-gcdump ps

Lista os processos dotnet para os quais os dumps GC podem ser coletados. dotnet-gcdump 6.0.320703 e posterior, também exibem os argumentos de linha de comando com os quais cada processo foi iniciado, se disponível.

Sinopse

dotnet-gcdump ps [-h|--help]

Exemplo

Suponha que você inicie um aplicativo de longa execução usando o comando dotnet run --configuration Release. Em outra janela, você executa o dotnet-gcdump ps comando. A saída que você verá é a seguinte. Os argumentos de linha de comando, se houver, são mostrados usando a dotnet-gcdump versão 6.0.320703 e posterior.

> 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>

Gere um relatório a partir de um dump GC gerado anteriormente ou de um processo em execução e escreva no stdout.

Sinopse

dotnet-gcdump report [-h|--help] [-p|--process-id <pid>] [-t|--report-type <HeapStat>]

Opções

  • -h|--help

    Mostra a ajuda da linha de comando.

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

    A ID do processo a partir da qual coletar o despejo GC.

  • -t|--report-type <HeapStat>

    O tipo de relatório a ser gerado. Opções disponíveis: heapstat (padrão).

Examples

  • Gerar um relatório de estatísticas de heap a partir de um ficheiro previamente criado .gcdump :

    > dotnet-gcdump report ./20250601_121500_1902.gcdump
    

    A saída apresenta estatísticas de tipos:

              Size (Bytes) Count       Type
            ============== =====       ====
            1,603,588,000  22,000,000  System.String
              201,096,000   2,010,000  System.Byte[]
              100,000,000   1,000,000  System.Char[]
               50,000,000     500,000  System.Object[]
               25,000,000     250,000  MyApp.Customer
    
  • Gerar um relatório de estatísticas de heap a partir de um processo em execução com ID de processo 1902:

    > dotnet-gcdump report --process-id 1902
    

Resolver problemas

  • Não há informações de tipo no gcdump.

    Antes do .NET Core 3.1, havia um problema em que um cache de tipo não era limpo entre gcdumps quando eles eram invocados com o EventPipe. Isso resultou no não envio dos eventos necessários para determinar as informações de tipo para o segundo e subsequentes gcdumps. Isso foi corrigido no .NET Core 3.1-preview2.

  • Os tipos COM e estático não estão no dump GC.

    Antes do .NET Core 3.1, havia um problema em que os tipos estáticos e COM não eram enviados quando o despejo GC era invocado via EventPipe. Isso foi corrigido no .NET Core 3.1.

  • dotnet-gcdump não é possível gerar um .gcdump arquivo devido a informações ausentes, por exemplo, [Erro] Exceção durante gcdump: System.ApplicationException: O arquivo ETL mostra o início de um despejo de pilha, mas não sua conclusão.. Ou, o .gcdump arquivo não inclui a pilha inteira.

    dotnet-gcdump funciona através da recolha de um vestígio de eventos emitidos pelo coletor de lixo durante uma recolha induzida de geração 2. Se o heap for suficientemente grande ou não houver memória suficiente para dimensionar os buffers de eventos, os eventos necessários para reconstruir o gráfico de heap a partir do rastreamento poderão ser descartados. Neste caso, para diagnosticar problemas com a pilha, recomenda-se coletar um despejo do processo.

  • dotnet-gcdump parece causar um problema de falta de memória em um ambiente restrito de memória.

    dotnet-gcdump funciona através da recolha de um vestígio de eventos emitidos pelo coletor de lixo durante uma recolha induzida de geração 2. O buffer para coleta de eventos pertence ao aplicativo de destino e pode crescer até 256 MB. dotnet-gcdump ela própria também usa a memória. Se o seu ambiente estiver com restrição de memória, certifique-se de levar em conta esses fatores ao coletar um gcdump para evitar erros.