Configurando um ambiente de criação de perfil
Observação
Houve uma mudança substancial para a criação de perfil na .NET Framework versão 4.Consulte criar o perfil do.NET Framework 4 para alterações que afetam a configuração de backup de ambientes de criação de perfil.
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 para decidir se o processo deve se conectar a um gerador de perfil a seguintes:
COR_ENABLE_PROFILING: O CLR se conecta a um gerador de perfil se a variável de ambiente existe e é definido como 1.
COR_PROFILER: Se o COR_ENABLE_PROFILING passa de seleção, o CLR conecta o criador de perfil que possui esse CLSID ou ProgID, que deve ter sido armazenado anteriormente no registro. A variável de ambiente COR_PROFILER é definida como uma seqüência de caracteres, conforme mostrado nos dois exemplos a seguintes.
set COR_PROFILER={32E2F4DA-1BEA-47ea-88F9-C5DAF691C94A} set COR_PROFILER="MyProfiler"
Para criar o perfil de um aplicativo do 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 o profiler DLL está registrado.
Observação
Começando com o .NET Framework 4, geradores de perfis não precisam ser registrado.Para obter informações sobre como iniciar os geradores de perfis sem registrá-los como componentes COM, consulte livre de registro inicialização do Profiler e anexar.
Observação
Para usar.Geradores de perfis do NET Framework versões 2.0, 3.0 e 3.5 na .NET Framework 4 e versões posteriores, você deve definir a variável de ambiente COMPLUS_ProfAPI_ProfilerCompatibilitySetting.Para obter mais informações sobre essa variável, consulte Configurações de compatibilidade do Profiler.
Escopo de variáveis de ambiente
Como você definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER para determinar o escopo de influência. Você pode definir essas variáveis em uma das seguintes maneiras:
Se você definir as variáveis em uma ICorDebug::CreateProcess chamada, elas se aplicarão apenas para o aplicativo que você está executando no momento. (Eles também serão aplicadas a outros aplicativos iniciados pelo aplicativo que herdam o ambiente.)
Se você definir as variáveis em uma janela de Prompt de comando, elas se aplicarão a todos os aplicativos que são iniciados dessa janela.
Se você definir as variáveis no nível do usuário, elas se aplicarão a todos os aplicativos que você iniciar com o Windows Explorer. Uma janela de Prompt de comando que você abrir depois de definir as variáveis terá essas configurações de ambiente e também qualquer aplicativo que você iniciar a partir dessa janela. Para definir variáveis de ambiente no nível de usuário, clique com o botão direito Meu computador, clique em Propriedades, clique o Avançado , clique em Variáveis de ambientee adicionar as variáveis para o variáveis de usuário lista.
Se você definir as variáveis no nível do computador, elas se aplicarão a todos os aplicativos que são iniciados no computador. Uma janela de Prompt de comando que você abrir nesse computador terão essas configurações de ambiente e também qualquer aplicativo que você iniciar a partir dessa janela. Isso significa que todos os processos gerenciados no computador serão iniciado com o seu gerador de perfil. Para definir variáveis de ambiente no nível do computador, clique com o botão direito Meu computador, clique em Propriedades, clique o Avançado , clique em Variáveis de ambiente, adicionar as variáveis para o variáveis do sistema lista e, em seguida, reinicie seu computador. Após a reinicialização, as variáveis será o âmbito do sistema disponível.
Se estiver criando o perfil de um serviço do Windows, reinicie o computador depois de definir as variáveis de ambiente e registrar o DLL do profiler. Para obter mais informações sobre essas considerações, consulte a seção um serviço do Windows para criação de perfil.
Considerações adicionais
A classe implementa o profiler a ICorProfilerCallback e ICorProfilerCallback2 interfaces. No.NET Framework versão 2.0, um gerador de perfil deve implementar ICorProfilerCallback2. Se isso não acontecer, ICorProfilerCallback2 não será carregado.
Apenas um profiler pode criar o perfil de um processo ao mesmo tempo em um determinado ambiente. Você pode registrar os dois geradores de perfis diferentes em diferentes ambientes, mas cada um deve criar o perfil de processos separados. O profiler deve ser implementado como um servidor de COM em processo DLL, que é mapeado para o mesmo espaço de endereço do processo que está sendo perfilado. Isso significa que o profiler é executado no processo. A.NET Framework não oferece suporte a qualquer outro tipo de servidor COM. Por exemplo, se quiser que um profiler monitorar os aplicativos a partir de um computador remoto, ele deve implementar agentes de coletor em cada computador. Esses agentes serão os resultados de lote e comunicar-se ao computador de coleta de dados central.
Como o profiler é um objeto COM que é instanciado no processo, cada aplicativo perfilado terá sua própria cópia do profiler. Portanto, não tem uma instância única do profiler lidar com dados de vários aplicativos. No entanto, você terá que adicionar lógica de código de log do profiler para impedir que o arquivo de log substitui de outros aplicativos perfilados.
Inicializando o Profiler
Quando as verificações de variável de ambiente passam, o CLR cria uma instância do profiler de forma semelhante para o COM CoCreateInstance função. O profiler não é carregado por meio de uma chamada direta para CoCreateInstance. Portanto, uma chamada para CoInitialize, que requer a definição de modelo de threading é evitado. O CLR, em seguida, chama o ICorProfilerCallback::Initialize método em que o profiler. A assinatura desse método é o seguinte.
HRESULT Initialize(IUnknown *pICorProfilerInfoUnk)
O profiler deve consultar pICorProfilerInfoUnk para um ICorProfilerInfo ou ICorProfilerInfo2 ponteiro de interface e salvá-lo para que ele pode solicitar mais informações, mais tarde durante a criação de perfil.
Definir notificações de evento
O criador de perfil, em seguida, chama o ICorProfilerInfo::SetEventMask método para especificar quais categorias de notificações interessado em. Por exemplo, se o profiler está interessado somente na função entram e saem de notificações e notificações de coleta de lixo, especifica o seguinte.
ICorProfilerInfo* pInfo;
pICorProfilerInfoUnk->QueryInterface(IID_ICorProfilerInfo, (void**)&pInfo);
pInfo->SetEventMask(COR_PRF_MONITOR_ENTERLEAVE | COR_PRF_MONITOR_GC)
Definindo a máscara de notificações dessa maneira, o profiler pode limitar a qual as notificações recebidas. Essa abordagem ajuda o usuário a criar um gerador de perfil simple ou de finalidade especial. Ele também reduz o tempo de CPU que teria perdido o envio de notificações que o profiler poderia ignorar.
Certos eventos do profiler são imutáveis. Isso significa que, assim que esses eventos são definidos na ICorProfilerCallback::Initialize o retorno de chamada, não pode ser desativados e novos eventos não podem ser ativados. Tentativas de alterar um evento imutável resultará em ICorProfilerInfo::SetEventMask retornar uma falha HRESULT.
Definindo o perfil de um serviço do Windows
Definindo o perfil de um serviço do Windows é semelhante a um aplicativo de tempo de execução de linguagem comum de criação de perfil. Ambas as operações de criação de perfil são ativadas por meio de variáveis de ambiente. Porque um serviço do Windows é iniciado quando o sistema operacional começa, as variáveis de ambiente discutidas anteriormente neste tópico já deve estar presente e definida para os valores necessários antes de iniciar o sistema. Além disso, a DLL de criação de perfil já deve ser registrada no sistema.
Depois de definir as variáveis de ambiente COR_ENABLE_PROFILING e COR_PROFILER e registrar o DLL do profiler, você deve reiniciar o computador de destino para que o serviço do Windows possa detectar essas alterações.
Observe que essas alterações permitirá a criação de perfil em uma base de todo o sistema. Para impedir que todos os aplicativos gerenciados que subseqüentemente é executado a partir de que está sendo perfilada, você deve excluir as variáveis de ambiente do sistema após a reinicialização do computador de destino.
Essa técnica também leva a cada processo CLR, obtendo perfilados. O profiler deve adicionar lógica para seu ICorProfilerCallback::Initialize o retorno de chamada para detectar se o processo atual é de interesse. Se não estiver, o profiler pode falhar o retorno de chamada sem executar a inicialização.