Quais ferramentas de diagnóstico estão disponíveis no .NET Core?
O software nem sempre se comporta como esperado, mas o .NET Core tem ferramentas e APIs que ajudarão você a diagnosticar esses problemas de maneira rápida e eficaz.
Este artigo ajuda a identificar as diversas ferramentas de que você precisa.
Depuradores
Depuradores permitem que você interaja com seu programa. Pausar, executar incrementalmente, examinar e retomar fornecem informações sobre o comportamento do seu código. Um depurador é uma boa opção para diagnosticar problemas funcionais que podem ser facilmente reproduzidos.
Teste de unidade
O teste de unidade é um componente-chave da integração contínua e da implantação de um software de alta qualidade. Os testes de unidade são projetados para fornecer um aviso antecipado quando você interrompe algo.
Instrumentação para observabilidade
O .NET dá suporte a técnicas de instrumentação padrão do setor usando métricas, logs e rastreamentos distribuídos. Instrumentação é um código que é adicionado a um projeto de software para registrar o que ele está fazendo. Essas informações podem ser coletadas em arquivos, bancos de dados ou na memória e analisadas para entender como um programa de software está operando. Isso geralmente é usado em ambientes de produção para monitorar problemas e diagnosticá-los. O runtime do .NET tem instrumentação interna que pode ser opcionalmente habilitada e APIs que permitem adicionar instrumentação personalizada especializada para seu aplicativo.
Métricas
As métricas são medidas numéricas registradas ao longo do tempo para monitorar o desempenho e a integridade do aplicativo. As métricas geralmente são usadas para gerar alertas quando possíveis problemas são detectados. As métricas têm uma sobrecarga de desempenho muito baixa e muitos serviços as configuram como telemetria sempre ativa.
Logs
O registro em log é uma técnica em que o código é instrumentado para produzir um log, um registro de eventos interessantes que ocorreram durante a execução do programa. Geralmente, um conjunto de linha de base de eventos de log é configurado por padrão e o registro em log mais extenso pode ser habilitado sob demanda para diagnosticar problemas específicos. A sobrecarga de desempenho é variável dependendo da quantidade de dados que está sendo registrada.
Rastreamentos distribuídos
O Rastreamento Distribuído é uma forma especializada de registro em log que ajuda a localizar falhas e problemas de desempenho em aplicativos distribuídos em vários computadores ou processos. Essa técnica rastreia solicitações por meio de um aplicativo correlacionando o trabalho em conjunto feito por diferentes componentes do aplicativo e separando-o de outros trabalhos que o aplicativo pode estar fazendo para solicitações simultâneas. É possível rastrear todas as solicitações e amostras que podem ser empregadas opcionalmente para associar a sobrecarga de desempenho.
Despejos
Um despejo é um arquivo que contém um instantâneo do processo no momento da criação. Eles podem ser úteis para examinar o estado do aplicativo para fins de depuração.
Símbolos
Símbolos são um mapeamento entre o código-fonte e o binário produzido pelo compilador. Eles são comumente usados por depuradores .NET para resolver números de linha de origem, nomes de variáveis locais e outros tipos de informações de diagnóstico.
Coletar diagnósticos em contêineres
As mesmas ferramentas de diagnóstico usadas em ambientes Linux não conteinerizados também podem ser usadas para coletar diagnósticos em contêineres. Há apenas algumas alterações de uso necessárias para garantir que as ferramentas funcionem em um contêiner do Docker.
Ferramentas globais de diagnóstico do .NET Core
dotnet-counters
O dotnet-counters é uma ferramenta de monitoramento de desempenho para monitoramento de integridade de primeiro nível e investigação de desempenho. Ele observa os valores do contador de desempenho publicados por meio da API EventCounter. Por exemplo, você pode monitorar rapidamente itens como o uso da CPU ou a taxa de exceções que está sendo gerada em seu aplicativo .NET Core.
dotnet-dump
A ferramenta dotnet-dump é uma maneira de coletar e analisar despejos de núcleo do Windows e do Linux sem um depurador nativo.
dotnet-gcdump
A ferramenta dotnet-gcdump é uma maneira de coletar despejos do GC (Coletor de Lixo) de processos .NET dinâmicos.
dotnet-trace
O .NET Core inclui o que é chamado o EventPipe
, por meio do qual dados de diagnóstico são expostos. A ferramenta dotnet-trace permite que você consuma dados interessantes de criação de perfil de seu aplicativo que podem ajudar em cenários em que você precisa criar uma raiz para causar lentidão nos aplicativos.
dotnet-stack
A ferramenta dotnet-stack permite que você imprima rapidamente as pilhas gerenciadas para todos os threads em um processo .NET em execução.
dotnet-symbol
O dotnet-symbol baixa arquivos de download (símbolos, DAC/DBI, arquivos de host etc.) necessários para abrir um despejo de núcleo ou um minidespejo. Use essa ferramenta se precisar de símbolos e módulos para depurar um arquivo de despejo capturado em um computador diferente.
dotnet-sos
o dotnet-sos instala a extensão de depuração SOS no Linux e no macOS (e no Windows se você estiver usando Windbg/cdb).
PerfCollect
PerfCollect é um script bash que você pode usar para coletar rastreamentos com perf
e LTTng
para uma análise de desempenho mais aprofundada de aplicativos .NET em execução em distribuições do Linux.
Tutoriais de diagnóstico do .NET Core
Escrever sua própria ferramenta de diagnóstico
A biblioteca de clientes de diagnóstico permite que você escreva sua própria ferramenta de diagnóstico personalizada mais adequada para seu cenário de diagnóstico. Pesquise informações na referência da API do Microsoft.Diagnostics.NETCore.Client.
Depurar um vazamento de memória
O tutorial: Depurar um vazamento de memória detalha como encontrar um vazamento de memória. A ferramenta dotnet-counters é usada para confirmar o vazamento e a ferramenta dotnet-dump for usada para diagnosticar o vazamento.
Depurar alto uso da CPU
O tutorial: Depurar o alto uso da CPU orienta você na investigação do alto uso da CPU. Ele usa a ferramenta dotnet-counters para confirmar o alto uso da CPU. Em seguida, ele orienta você usando o Rastreamento para análise de desempenho (dotnet-trace
) ou Linux perf
para coletar e exibir o perfil de uso da CPU.
Depurar deadlock
O tutorial: Deadlock de depuração mostra como usar a ferramenta dotnet-dump para investigar threads e bloqueios.
Depurar ThreadPool Starvation
Tutorial: Depurar a escassez de threadPool mostra como usar as ferramentas dotnet-counters e dotnet-stack para investigar a escassez de ThreadPool.
Depurar um StackOverflow
Tutorial: Depurar um StackOverflow demonstra como depurar um StackOverflowException no Linux.
Depurar despejos do Linux
Depurar despejos do Linux explica como coletar e analisar despejos no Linux.
Medir o desempenho usando EventCounters
Tutorial: Medir o desempenho usando EventCounters no .NET mostra como usar a API EventCounter para medir o desempenho em seu aplicativo .NET.