Diagnóstico e instrumentação
O AOT nativo compartilha alguns, mas não todos, recursos de diagnóstico e instrumentação com o tempo de execução completo do .NET. Os aplicativos que são compatíveis com trim não devem ter diferenças comportamentais, portanto, as investigações geralmente se aplicam a ambos os tempos de execução. Como tal, às vezes é apropriado diagnosticar e depurar problemas no tempo de execução completo do .NET, pois ele tem uma rica seleção de utilitários de diagnóstico disponíveis. No entanto, algumas informações só podem ser coletadas após a publicação, portanto, o Native AOT também fornece ferramentas de diagnóstico pós-publicação.
Suporte nativo ao diagnóstico de AOT
A tabela a seguir resume os recursos de diagnóstico suportados para implantações AOT nativas:
Caraterística | Totalmente suportado | Parcialmente suportado | Não suportado |
---|---|---|---|
Observabilidade e telemetria | Parcialmente suportado | ||
Diagnósticos em tempo de desenvolvimento | Totalmente suportado | ||
Depuração nativa | Parcialmente suportado | ||
Criação de perfil da CPU | Parcialmente suportado | ||
Análise de heap | Não suportado |
Observabilidade e telemetria
A partir do .NET 8, o tempo de execução nativo do AOT suporta EventPipe, que é a camada base usada por muitas bibliotecas de registro em log e rastreamento. Você pode interagir com o EventPipe diretamente por meio de APIs como EventSource.WriteEvent
ou pode usar bibliotecas criadas sobre isso, como OpenTelemetry. O suporte ao EventPipe também permite que ferramentas de diagnóstico .NET, como dotnet-trace, dotnet-counters e dotnet-monitor, funcionem perfeitamente com AOT nativo ou aplicativos de tempo de execução .NET completos. O EventPipe é um componente opcional na AOT nativa. Para incluir o suporte a EventPipe, defina a EventSourceSupport
propriedade MSBuild como true
.
<PropertyGroup>
<EventSourceSupport>true</EventSourceSupport>
</PropertyGroup>
A AOT nativa fornece suporte parcial para alguns provedores de eventos bem conhecidos. Nem todos os eventos de tempo de execução são suportados na AOT nativa.
Diagnósticos em tempo de desenvolvimento
As ferramentas da CLI do .NET (dotnet
SDK) e o Visual Studio oferecem comandos separados para build
e publish
. build
(ou Start
no Visual Studio) usa o tempo de execução completo do .NET. Cria apenas publish
um aplicativo AOT nativo. Publicar seu aplicativo como AOT nativo produz um aplicativo que foi compilado antecipadamente no tempo (AOT) para código nativo. Como mencionado anteriormente, nem todas as ferramentas de diagnóstico funcionam perfeitamente com aplicativos AOT nativos publicados no .NET 8. No entanto, todas as ferramentas de diagnóstico do .NET estão disponíveis para desenvolvedores durante o estágio de criação do aplicativo. Recomendamos desenvolver, depurar e testar os aplicativos como de costume e publicar o aplicativo de trabalho com AOT nativo como uma das últimas etapas.
Depuração nativa
Quando você executa seu aplicativo durante o desenvolvimento, como dentro do Visual Studio, ou com dotnet run
, dotnet build
ou dotnet test
, ele é executado no tempo de execução completo do .NET por padrão. No entanto, se PublishAot
estiver presente no arquivo de projeto, o comportamento deve ser o mesmo entre o tempo de execução completo do .NET e o AOT nativo. Essa característica permite que você use o mecanismo de depuração gerenciado padrão do Visual Studio para desenvolvimento e teste.
Após a publicação, os aplicativos AOT nativos são verdadeiros binários nativos. O depurador gerenciado não funcionará neles. No entanto, o compilador AOT nativo gera arquivos executáveis totalmente nativos que os depuradores nativos podem depurar em sua plataforma de escolha (por exemplo, WinDbg ou Visual Studio no Windows e gdb ou lldb em sistemas Unix-like).
O compilador AOT nativo gera informações sobre números de linha, tipos, locais e parâmetros. O depurador nativo permite inspecionar o rastreamento de pilha e variáveis, entrar ou ultrapassar linhas de origem ou definir pontos de interrupção de linha.
Para depurar exceções gerenciadas, defina um ponto de interrupção no RhThrowEx
método, que é chamado sempre que uma exceção gerenciada é lançada. A exceção é armazenada no rcx
ou x0
registo. Se o depurador oferecer suporte à exibição de objetos C++, você poderá converter o registro para S_P_CoreLib_System_Exception*
para ver mais informações sobre a exceção.
Coletar um arquivo de despejo para um aplicativo AOT nativo envolve algumas etapas manuais no .NET 8.
Notas específicas do Visual Studio
Você pode iniciar um executável compilado por AOT nativo no depurador do Visual Studio abrindo-o no IDE do Visual Studio. Você precisa abrir o próprio executável no Visual Studio.
Para definir um ponto de interrupção que quebra sempre que uma exceção é lançada, escolha a opção Pontos de interrupção no menu Depurar > Windows . Na nova janela, selecione Novo > ponto de interrupção de função . Especifique RhThrowEx
como o Nome da Função e deixe a opção Idioma em Todos os Idiomas (não selecione C#).
Para ver qual exceção foi lançada, inicie a depuração (Debug > Start Debugging ou F5), abra a janela Watch (Debug > Windows > Watch) e adicione a seguinte expressão como um dos relógios: (S_P_CoreLib_System_Exception*)@rcx
. Este mecanismo aproveita o fato de que, no momento RhThrowEx
em que é chamado, o registro de CPU x64 RCX contém a exceção lançada. Você também pode colar a expressão na janela Immediate; A sintaxe é a mesma dos relógios.
Importância do arquivo de símbolos
Ao publicar, o compilador AOT nativo produz um arquivo executável e um arquivo de símbolo. A depuração nativa e atividades relacionadas, como criação de perfil, exigem acesso ao arquivo de símbolo nativo. Se esse arquivo não estiver presente, você pode ter resultados degradados ou quebrados.
Para obter informações sobre o nome e o local do arquivo de símbolo, consulte Informações de depuração nativas.
Criação de perfil da CPU
Ferramentas específicas da plataforma, como PerfView e Perf, podem ser usadas para coletar amostras de CPU de um aplicativo AOT nativo.
Análise de heap
Atualmente, a análise de heap gerenciada não é suportada na AOT nativa. Ferramentas de análise de heap como dotnet-gcdump, PerfView e ferramentas de análise de heap do Visual Studio não funcionam no AOT nativo no .NET 8.