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.
Observação
Houve alterações substanciais na criação de perfil no .NET Framework 4.
Quando um processo gerenciado (aplicativo ou serviço) é iniciado, ele carrega o Common Language Runtime (CLR). Quando o CLR é inicializado, ele avalia as duas variáveis ambientais a seguir para decidir se o processo deve se conectar a um criador de perfil:
COR_ENABLE_PROFILING: O CLR se conecta a um criador de perfil somente se essa variável de ambiente existir e estiver definida como 1.
COR_PROFILER: Se a verificação de COR_ENABLE_PROFILING for aprovada, o CLR se conectará ao criador de perfil que tem esse CLSID ou ProgID, que deve ter sido armazenado anteriormente no registro. A variável de ambiente COR_PROFILER é definida como uma cadeia de caracteres, conforme mostrado nos dois exemplos a seguir.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Para criar o perfil de um aplicativo CLR, você deve definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER antes de executar o aplicativo. Você também deve certificar-se de que a DLL do criador de perfil está registrada.
Observação
A partir do .NET Framework 4, os criadores de perfil não precisam ser registrados.
Observação
Para usar os criadores de perfil do .NET Framework versões 2.0, 3.0 e 3.5 no .NET Framework 4 e versões posteriores, você deve definir a variável de ambiente COMPLUS_ProfAPI_ProfilerCompatibilitySetting.
Escopo da variável de ambiente
A forma como você define as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER determinará seu escopo de influência. Você pode definir essas variáveis de uma das seguintes maneiras:
Se você definir as variáveis em uma chamada ICorDebug::CreateProcess , elas serão aplicadas somente ao aplicativo que você está executando no momento. (Eles também se aplicarão a outros aplicativos iniciados por esse aplicativo que herdam o ambiente.)
Se você definir as variáveis em uma janela de prompt de comando, elas serão aplicadas a todos os aplicativos iniciados a partir dessa janela.
Se você definir as variáveis no nível do usuário, elas serão aplicadas a todos os aplicativos iniciados com o Explorador de Arquivos. Uma janela do Prompt de Comando que você abrir depois de definir as variáveis terá essas configurações de ambiente, assim como qualquer aplicativo iniciado a partir dessa janela. Para definir variáveis de ambiente no nível do usuário, clique com o botão direito do mouse em Meu Computador, clique em Propriedades, clique na guia Avançado , clique em Variáveis de Ambiente e adicione as variáveis à lista Variáveis de usuário .
Se você definir as variáveis no nível do computador, elas serão aplicadas a todos os aplicativos iniciados nesse computador. Uma janela de Prompt de Comando que você abrir nesse computador terá essas configurações de ambiente, assim como qualquer aplicativo iniciado a partir dessa janela. Isso significa que todos os processos gerenciados nesse computador começarão com seu criador de perfil. Para definir variáveis de ambiente no nível do computador, clique com o botão direito do mouse em Meu Computador, clique em Propriedades, clique na guia Avançado , clique em Variáveis de Ambiente, adicione as variáveis à lista Variáveis do sistema e reinicie o computador. Após a reinicialização, as variáveis estarão disponíveis em todo o sistema.
Se você estiver criando o perfil de um serviço do Windows, deverá reiniciar o computador depois de definir as variáveis de ambiente e registrar a DLL do criador de perfil. Para obter mais informações sobre essas considerações, consulte a seção Criação de perfil de um serviço do Windows.
Considerações adicionais
A classe profiler implementa as interfaces ICorProfilerCallback e ICorProfilerCallback2 . No .NET Framework versão 2.0, um criador de perfil deve implementar
ICorProfilerCallback2o . Se não o fizer,ICorProfilerCallback2não será carregado.Apenas um criador de perfil pode criar o perfil de um processo de cada vez em um determinado ambiente. Você pode registrar dois criadores de perfil diferentes em ambientes diferentes, mas cada um deve criar perfis de processos separados. O criador de perfil deve ser implementado como uma DLL do servidor COM em processo, que é mapeada no mesmo espaço de endereço que o processo que está sendo perfilado. Isso significa que o criador de perfil é executado em processo. O .NET Framework não suporta qualquer outro tipo de servidor COM. Por exemplo, se um criador de perfil quiser monitorar aplicativos de um computador remoto, ele deverá implementar agentes coletores em cada computador. Estes agentes irão agrupar os resultados e comunicá-los ao computador central de recolha de dados.
Como o criador de perfil é um objeto COM que é instanciado em processo, cada aplicativo com perfil terá sua própria cópia do criador de perfil. Portanto, uma única instância do profiler não precisa manipular dados de vários aplicativos. No entanto, você terá que adicionar lógica ao código de log do criador de perfil para evitar que o arquivo de log seja substituído por outros aplicativos com perfil.
Inicializando o Profiler
Quando ambas as verificações de variáveis de ambiente são aprovadas, o CLR cria uma instância do criador de perfil de maneira semelhante à função COM CoCreateInstance . O criador de perfil não é carregado por meio de uma chamada direta para CoCreateInstance. Portanto, uma chamada para CoInitialize, que requer a definição do modelo de threading, é evitada. Em seguida, o CLR chama o método ICorProfilerCallback::Initialize no criador de perfil. A assinatura deste método é a seguinte.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
O criador de perfil deve consultar pICorProfilerInfoUnk um ponteiro de interface ICorProfilerInfo ou ICorProfilerInfo2 e salvá-lo para que ele possa solicitar mais informações posteriormente durante a criação de perfil.
Definindo notificações de eventos
Em seguida, o criador de perfil chama o método ICorProfilerInfo::SetEventMask para especificar em quais categorias de notificações está interessado. Por exemplo, se o criador de perfil estiver interessado apenas na função inserir e deixar notificações e notificações de coleta de lixo, ele especifica o seguinte.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Ao definir a máscara de notificações dessa maneira, o criador de perfil pode limitar quais notificações recebe. Essa abordagem ajuda o usuário a criar um criador de perfil simples ou para fins especiais. Ele também reduz o tempo da CPU que seria desperdiçado enviando notificações que o criador de perfil simplesmente ignoraria.
Certos eventos do profiler são imutáveis. Isso significa que, assim que esses eventos forem definidos no retorno de ICorProfilerCallback::Initialize chamada, eles não poderão ser desativados e novos eventos não poderão ser ativados. As tentativas de alterar um evento imutável resultarão no ICorProfilerInfo::SetEventMask retorno de um HRESULT com falha.
Definindo o perfil de um serviço do Windows
Criar o perfil de um serviço do Windows é como criar o perfil de um aplicativo Common Language Runtime. Ambas as operações de criação de perfil são habilitadas por meio de variáveis de ambiente. Como um Serviço do Windows é iniciado quando o sistema operacional é iniciado, as variáveis de ambiente discutidas anteriormente neste tópico já devem estar presentes e definidas com os valores necessários antes que o sistema seja iniciado. Além disso, a DLL de criação de perfil já deve estar registrada no sistema.
Depois de definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER e registrar a DLL do criador de perfil, reinicie o computador de destino para que o Serviço do Windows possa detetar essas alterações.
Observe que essas alterações permitirão a criação de perfil em todo o sistema. Para evitar que todos os aplicativos gerenciados executados subsequentemente sejam perfilados, exclua as variáveis de ambiente do sistema depois de reiniciar o computador de destino.
Esta técnica também leva a que todos os processos CLR sejam perfilados. O criador de perfil deve adicionar lógica ao seu ICorProfilerCallback::Initialize callback para detetar se o processo atual é de interesse. Se não estiver, o criador de perfil pode falhar no retorno de chamada sem executar a inicialização.