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
:
Ferramenta global dotnet:
Para instalar a versão mais recente do
dotnet-gcdump
pacote 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 Windows x86 x64 | Braço | Braço64 | 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>
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 .gcdump
s 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-gcdump
o , 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-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.