Partilhar via


Configurar um Ambiente de Criação de Perfis

Nota

Registaram-se alterações substanciais à criação de perfis no .NET Framework 4.

Quando um processo gerido (aplicação ou serviço) é iniciado, carrega o runtime de idioma comum (CLR). Quando o CLR é inicializado, avalia as duas variáveis ambientais seguintes para decidir se o processo deve ligar a um gerador de perfis:

  • COR_ENABLE_PROFILING: o CLR só se liga a um gerador de perfis se esta variável de ambiente existir e estiver definida como 1.

  • COR_PROFILER: se a verificação de COR_ENABLE_PROFILING for aprovada, o CLR liga-se ao gerador de perfis que tem este CLSID ou ProgID, que deve ter sido armazenado anteriormente no registo. A variável de ambiente COR_PROFILER é definida como uma cadeia, conforme mostrado nos dois exemplos seguintes.

    set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A}  
    set COR_PROFILER="MyProfiler"  
    

Para criar um perfil de uma aplicação CLR, tem de definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER antes de executar a aplicação. Também tem de se certificar de que a DLL do profiler está registada.

Nota

A partir do .NET Framework 4, os perfis não têm de ser registados.

Nota

Para utilizar .NET Framework versões 2.0, 3.0 e 3.5 profilers nas versões .NET Framework 4 e posteriores, tem de definir a variável de ambiente COMPLUS_ProfAPI_ProfilerCompatibilitySetting.

Âmbito da Variável de Ambiente

A forma como define as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER irá determinar o âmbito de influência. Pode definir estas variáveis de uma das seguintes formas:

  • Se definir as variáveis numa chamada ICorDebug::CreateProcess , estas serão aplicadas apenas à aplicação que está a executar no momento. (Também serão aplicadas a outras aplicações iniciadas por essa aplicação que herdam o ambiente.)

  • Se definir as variáveis numa janela da Linha de Comandos, estas serão aplicadas a todas as aplicações iniciadas a partir dessa janela.

  • Se definir as variáveis ao nível do utilizador, estas serão aplicadas a todas as aplicações que começar por Explorador de Ficheiros. Uma janela da Linha de Comandos que abre depois de definir as variáveis terá estas definições de ambiente, assim como qualquer aplicação que iniciar a partir dessa janela. Para definir variáveis de ambiente ao nível do utilizador, clique com o botão direito do rato em O Meu Computador, clique em Propriedades, clique no separador Avançadas , clique em Variáveis de Ambiente e adicione as variáveis à lista Variáveis de utilizador .

  • Se definir as variáveis ao nível do computador, estas serão aplicadas a todas as aplicações iniciadas nesse computador. Uma janela da Linha de Comandos que abrir nesse computador terá estas definições de ambiente, assim como qualquer aplicação que iniciar a partir dessa janela. Isto significa que todos os processos geridos nesse computador começarão com o seu gerador de perfis. Para definir variáveis de ambiente ao nível do computador, clique com o botão direito do rato em O Meu Computador, clique em Propriedades, clique no separador Avançadas , clique em Variáveis de Ambiente, adicione as variáveis à lista Variáveis de sistema e, em seguida, reinicie o computador. Após reiniciar, as variáveis estarão disponíveis em todo o sistema.

Se estiver a criar perfis num Serviço Windows, tem de reiniciar o computador depois de definir as variáveis de ambiente e registar a DLL do gerador de perfis. Para obter mais informações sobre estas considerações, consulte a secção Criação de perfis de um Serviço Windows.

Considerações Adicionais

  • A classe profiler implementa as interfaces ICorProfilerCallback e ICorProfilerCallback2 . No .NET Framework versão 2.0, um gerador de perfis tem de implementar ICorProfilerCallback2. Caso contrário, ICorProfilerCallback2 não será carregado.

  • Apenas um gerador de perfis pode criar um perfil de um processo de uma só vez num determinado ambiente. Pode registar dois perfis diferentes em ambientes diferentes, mas cada um tem de criar perfis em processos separados. O gerador de perfis tem de ser implementado como uma DLL de servidor COM em processo, mapeada para o mesmo espaço de endereços que o processo que está a ser perfilado. Isto significa que o gerador de perfis é executado no processo. O .NET Framework não suporta qualquer outro tipo de servidor COM. Por exemplo, se um gerador de perfis quiser monitorizar aplicações a partir de um computador remoto, tem de implementar agentes recoletores em cada computador. Estes agentes irão criar um lote de resultados e comunicá-los ao computador de recolha de dados central.

  • Uma vez que o profiler é um objeto COM que é instanciado no processo, cada aplicação com perfil terá a sua própria cópia do gerador de perfis. Por conseguinte, uma única instância de gerador de perfis não tem de processar dados de várias aplicações. No entanto, terá de adicionar lógica ao código de registo do gerador de perfis para impedir substituições de ficheiros de registo de outras aplicações com perfis.

Inicializar o Profiler

Quando ambas as verificações de ambiente passam, o CLR cria uma instância do gerador de perfis de forma semelhante à função COM CoCreateInstance . O gerador de perfis não é carregado através de uma chamada direta para CoCreateInstance. Por conseguinte, é evitada uma chamada para CoInitialize, que requer a definição do modelo de threading. Em seguida, o CLR chama o método ICorProfilerCallback::Initialize no profiler. A assinatura deste método é a seguinte.

HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)  

O gerador de perfis tem de pICorProfilerInfoUnk consultar um ponteiro de interface ICorProfilerInfo ou ICorProfilerInfo2 e guardá-lo para que possa pedir mais informações mais tarde durante a criação de perfis.

Definir Notificações de Eventos

Em seguida, o gerador de perfis chama o método ICorProfilerInfo::SetEventMask para especificar em que categorias de notificações está interessado. Por exemplo, se o gerador de perfis estiver interessado apenas na função, introduza e deixe notificações e notificações de recolha de lixo, 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 desta forma, o gerador de perfis pode limitar as notificações que recebe. Esta abordagem ajuda o utilizador a criar um profiler simples ou para fins especiais. Também reduz o tempo de CPU que seria desperdiçado ao enviar notificações que o gerador de perfis iria simplesmente ignorar.

Determinados eventos do profiler são imutáveis. Isto significa que, assim que estes eventos são definidos na ICorProfilerCallback::Initialize chamada de retorno, não podem ser desativados e não é possível ativar novos eventos. As tentativas de alterar um evento imutável resultarão na ICorProfilerInfo::SetEventMask devolução de um HRESULT falhado.

Criar perfis num Serviço Windows

Criar perfis num Serviço Windows é como criar perfis de uma aplicação de runtime de linguagem comum. Ambas as operações de criação de perfis são ativadas através de variáveis de ambiente. Uma vez que um Serviço Windows é iniciado quando o sistema operativo é iniciado, as variáveis de ambiente abordadas anteriormente neste tópico já têm de estar presentes e definidas para os valores necessários antes do início do sistema. Além disso, a DLL de criação de perfis já tem de estar registada no sistema.

Depois de definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER e registar a DLL do gerador de perfis, deve reiniciar o computador de destino para que o Serviço Windows possa detetar essas alterações.

Tenha em atenção que estas alterações permitirão a criação de perfis a nível do sistema. Para impedir que todas as aplicações geridas executadas posteriormente sejam perfiladas, deve eliminar as variáveis de ambiente do sistema depois de reiniciar o computador de destino.

Esta técnica também leva a que cada processo CLR seja perfilado. O gerador de perfis deve adicionar lógica ao respetivo ICorProfilerCallback::Inicializar a chamada de retorno para detetar se o processo atual é de interesse. Se não for, o gerador de perfis pode falhar a chamada de retorno sem efetuar a inicialização.

Ver também