Partilhar via


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

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

Instalar

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

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>

Description

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

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.

  • -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, este comando espera que o aplicativo de destino e dotnet-gcdump compartilhe a mesma TMPDIR variável de ambiente. Caso contrário, o comando atingirá o tempo limite.

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.

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

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-gcdumpnão é possível gerar um arquivo devido a informações ausentes, por exemplo, [Erro] Exceção durante gcdump: System.ApplicationException: O arquivo ETL mostra o início de um .gcdump 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.