Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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-gcdumpDownload 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
--versionExibe a versão do
dotnet-gcdumputilitário.-h|--helpMostra 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|--helpMostra 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-gcdumpcompartilhar a mesmaTMPDIRvariá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|--verboseSaí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-gcdumpcompartilhar a mesmaTMPDIRvariá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-idopçõ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-addressdifere 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
,connectapós o endereço. Por exemplo,--diagnostic-port /foo/tool1.socket,connectse conectará a um processo de tempo de execução .NET que está ouvindo o soquete de/foo/tool1.socketdomínio Unix.- Linux e macOS - um caminho para um soquete de domínio Unix como
--dsrouter <ios|ios-sim|android|android-emu>Inicia dotnet-dsrouter e se conecta a ele. Requer dotnet-dsrouter para ser instalado. Corra
dotnet-dsrouter -hpara 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|--helpMostra 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.gcdumpA 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.CustomerGerar 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-gcdumpnão é possível gerar um.gcdumparquivo 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.gcdumparquivo não inclui a pilha inteira.dotnet-gcdumpfunciona 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-gcdumpparece causar um problema de falta de memória em um ambiente restrito de memória.dotnet-gcdumpfunciona 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-gcdumpela 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.