Provedores ETW no CLR
O CLR (Common Language Runtime) tem dois provedores: o provedor de tempo de execução e o provedor de encerramento.
O provedor de runtime aciona eventos, dependendo de quais palavras-chave (categorias de eventos) são habilitadas. Por exemplo, é possível coletar eventos de carregador habilitando a palavra-chave LoaderKeyword
.
Os eventos do ETW (Rastreamento de Eventos para Windows) são registrados em log em um arquivo que tem uma extensão .etl, que mais tarde pode ser pós-processado em arquivos .csv (valor separado por vírgula), conforme necessário. Para obter informações sobre como converter o arquivo .etl em um arquivo .csv, consulte Controlando o log do .NET Framework.
O provedor de runtime
O provedor de runtime é o principal provedor CLR ETW.
O GUID do provedor de runtime CLR é e13c0d23-ccbc-4e12-931b-d9cc2eee27e4.
Para obter exemplos de como registrar e exibir eventos CLR ETW usando as ferramentas geralmente disponíveis, consulte Controlando o log do .NET Framework.
Além de usar palavras-chave como LoaderKeyword
, talvez você precise habilitar palavras-chave para registrar eventos que podem ser acionados com muita frequência. As palavras-chave StartEnumerationKeyword
e EndEnumerationKeyword
habilitam esses eventos e são resumidas em Palavras-chave e níveis CLR ETW.
O provedor de encerramento
O provedor de encerramento deve ser ativado para determinados usos de finalidade especial. No entanto, para a maioria dos usuários, o provedor de runtime deve ser suficiente.
O GUID do provedor de encerramento CLR é A669021C-C450-4609-A035-5AF59AF4DF18.
Normalmente, o log ETW é habilitado antes do início de um processo e é desativado depois que o processo é fechado. No entanto, se o log ETW for ativado durante a execução do processo, serão necessárias informações adicionais sobre o processo. Por exemplo, para a resolução de símbolo, você precisa registrar eventos de método para métodos que já foram carregados antes da ativação do log.
Os eventos DCStart
e DCEnd
capturam o estado do processo quando a coleta de dados foi iniciada e interrompida. (Estado refere-se às informações em um alto nível, incluindo os métodos que já foram compilados pelo JIT [Just-In-Time] e os assemblies que foram carregados.) Esses dois eventos podem fornecer informações sobre o que já ocorreu no processo; por exemplo, quais métodos foram compilados pelo JIT e assim por diante.
Somente os eventos com DC
, DCStart
, DCEnd
ou DCInit
em seus nomes são acionados no provedor de encerramento. Além disso, esses eventos são acionados apenas no provedor de encerramento.
Além dos filtros de palavra-chave do evento, o provedor de encerramento também dá suporte às palavras-chave StartRundownKeyword
e EndRundownKeyword
para fornecer filtragem direcionada.
Encerramento inicial
Um encerramento inicial é disparado quando o log no provedor de encerramento é habilitado com a palavra-chave StartRundownKeyword
. Isso faz com que o evento DCStart
seja acionado e captura o estado do sistema. Antes do início da enumeração, o evento DCStartInit
é acionado. Ao final da enumeração, o evento DCStartComplete
é acionado para notificar o controlador de que a coleta de dados terminou normalmente.
Encerramento final
Um encerramento final é disparado quando o log no provedor de encerramento é habilitado com a palavra-chave EndRundownKeyword
. O encerramento final interrompe a criação de perfil em um processo que continua sendo executado. Os eventos DCEnd
capturam o estado do sistema quando a criação de perfil é interrompida.
Antes do início da enumeração, o evento DCEndInit
é acionado. Ao final da enumeração, o evento DCEndComplete
é acionado para notificar o consumidor de que a coleta de dados terminou normalmente. O encerramento inicial e final são usados principalmente para a resolução de símbolo gerenciado. O encerramento inicial pode fornecer informações de intervalo de endereços para métodos que já foram compilados pelo JIT antes do início da sessão de criação de perfil. O encerramento final pode fornecer informações de intervalo de endereços para todos os métodos que foram compilados pelo JIT quando a criação de perfil está prestes a ser desativada.
O encerramento final não ocorre automaticamente quando uma sessão de criação de perfil é interrompida. Em vez disso, uma ferramenta que está tentando executar a resolução de símbolo gerenciado deve invocar explicitamente uma sessão do provedor de encerramento CLR com a palavra-chave EndRundownKeyword
habilitada, logo antes que a criação de perfil seja interrompida.
Embora o encerramento inicial ou final possa fornecer informações de intervalo de endereços do método para a resolução de símbolo gerenciado, recomendamos o uso da palavra-chave EndRundownKeyword
(que fornece eventos DCEnd
), em vez da palavra-chave StartRundownKeyword
(que fornece eventos DCStart
). O uso de StartRundownKeyword
faz com que o encerramento ocorra durante a sessão de criação de perfil, o que pode interferir no cenário com perfil criado.
Coleta de dados ETW usando o runtime e provedores de encerramento
O exemplo a seguir demonstra como usar o provedor de encerramento CLR de uma maneira que permite a resolução de símbolo de processos gerenciados com impacto mínimo, independentemente do início ou término dos processos dentro ou fora da janela com perfil criado.
Ative o log ETW usando o provedor de runtime do CLR:
xperf -start clr -on e13c0d23-ccbc-4e12-931b-d9cc2eee27e4:0x1CCBD:0x5 -f clr1.etl
O log será salvo no arquivo clr1.etl.
Para interromper a criação de perfil durante a execução do processo, inicie o provedor de encerramento para capturar os eventos
DCEnd
:xperf -start clrRundown -on A669021C-C450-4609-A035-5AF59AF4DF18:0xB8:0x5 -f clr2.etl
Isso permite que a coleção de eventos
DCEnd
inicie uma sessão de encerramento. Talvez seja necessário aguardar de 30 a 60 segundos para que todos os eventos sejam coletados. O log será salvo no arquivo clr1.et2.Desligue toda a criação de perfil ETW:
xperf -stop clrRundown xperf -stop clr
Mescle os perfis para criar um arquivo de log:
xperf -merge clr1.etl clr2.etl merged.etl
O arquivo merged.etl conterá os eventos do runtime e as sessões do provedor de encerramento.
Uma ferramenta pode executar as etapas 2 e 3 (iniciar uma sessão de encerramento e, em seguida, terminar a criação de perfil), em vez de desativar a criação de perfil imediatamente quando um usuário solicitar que a criação de perfil seja interrompida. Uma ferramenta também pode executar a etapa 4.