Partilhar via


Visão geral de criação de perfil

Um gerador de perfil é uma ferramenta que monitora a execução de outro aplicativo. Um gerador de perfil de runtime (CLR) de idioma comum é uma biblioteca de vínculo dinâmico (DLL) que consiste em funções que recebem mensagens e enviem mensagens para o CLR usando a API de criação de perfil. O profiler DLL é carregado pelo CLR em tempo de execução.

Ferramentas tradicionais de perfil focam em medir a execução da aplicação. Isto é, mede o tempo é gasto em cada função ou o uso de memória do aplicativo ao longo do tempo. A API de criação de perfil destina-se a uma classe mais ampla de ferramentas de diagnóstico, como utilitários de cobertura de código e até mesmo avançadas de auxílios de depuração. Esses usos são todos diagnóstico por natureza. A API de criação de perfil não apenas mede mas também monitora a execução de um aplicativo. Por esse motivo, a API de criação de perfil nunca deve ser usada pelo aplicativo propriamente dita e a execução do aplicativo não deve depender (ou ser afetado por) o profiler.

Definindo o perfil de um aplicativo do CLR requer suporte maior que a criação de perfil convencionalmente compilou o código de máquina. Isso ocorre porque o CLR introduz conceitos como, por exemplo, os domínios de aplicativo, coleta de lixo, gerenciado de manipulação de exceção, a compilação just-in-time (JIT) de código (convertendo Microsoft intermediate language ou MSIL, código em código de máquina nativo) e recursos semelhantes. Mecanismos de criação de perfil convencionais não é possível identificar ou fornecer informações úteis sobre esses recursos. A API de criação de perfil fornece essas informações ausentes com eficiência, com impacto mínimo sobre o desempenho do CLR e o aplicativo perfilado.

A compilação JIT em tempo de execução fornece boas oportunidades para a criação de perfil. A API de criação de perfil permite um gerador de perfil alterar o fluxo de código MSIL na memória para uma rotina para que ele seja compilado em JIT. Dessa forma, o profiler pode adicionar código de instrumentação dinamicamente as rotinas de determinado que precisam de investigação mais profunda. Embora essa abordagem é possível em cenários convencionais, é muito mais fácil de implementar o CLR usando a API de criação de perfil.

Esta visão geral consiste nas seções a seguir:

  • A API de criação de perfil

  • Recursos suportados

  • Threads de notificação

  • Segurança

  • Combinando gerenciado e código em um gerador de perfil de código não gerenciado

  • Definindo o perfil de código não gerenciado

  • Usando COM

  • Callstacks

  • Retornos de chamada e a profundidade da pilha

  • Tópicos relacionados

A API de criação de perfil

Normalmente, a API de criação de perfil é usada para gravar um código de, que é um programa que monitora a execução de um aplicativo gerenciado.

A API de criação de perfil é usada por um gerador de perfil DLL, que é carregado no mesmo processo como o aplicativo que está sendo perfilado. O profiler DLL implementa uma interface de retorno de chamada (ICorProfilerCallback na.NET Framework versão 1.0 e 1.1, ICorProfilerCallback2 na versão 2.0 e posterior). O CLR chama os métodos na interface para notificar o profiler de eventos no processo perfilado. O profiler pode chamar novamente o tempo de execução por usando os métodos de ICorProfilerInfo e ICorProfilerInfo2 interfaces para obter informações sobre o estado do aplicativo perfilado.

Observação

Somente a parte da coleta de dados da solução profiler deve estar em execução no mesmo processo como o aplicativo perfilado.Todos os usuário interface e análise de dados deve ser executada em um processo separado.

A ilustração a seguir mostra como o profiler DLL interage com o aplicativo que está sendo criado e o CLR.

Arquitetura de criação de perfil

Arquitetura de criaão de perfil

As Interfaces de notificação

ICorProfilerCallback e ICorProfilerCallback2 podem ser considerados como interfaces de notificação. Essas interfaces consistem em métodos como ClassLoadStarted, ClassLoadFinished, e JITCompilationStarted. Sempre que o CLR carrega ou descarrega uma classe, compila uma função, e assim por diante, ele chama o método correspondente o profiler ICorProfilerCallback ou ICorProfilerCallback2 interface.

Por exemplo, um gerador de perfil poderia medir o desempenho de código por meio de duas funções de notificação. FunctionEnter2 e FunctionLeave2. Ele apenas carimbos de hora cada notificação, acumula os resultados e uma lista que indica quais funções de saídas consumido mais tempo da CPU ou relógio de parede durante a execução do aplicativo.

As Interfaces de recuperação de informações

As outras interfaces principais envolvidos na criação de perfil são ICorProfilerInfo e ICorProfilerInfo2. O profiler chama essas interfaces, conforme necessário para obter mais informações para ajudar a sua análise. Por exemplo, sempre que o CLR chama o FunctionEnter2 função, ele fornece um identificador de função. O profiler pode obter mais informações sobre essa função chamando o ICorProfilerInfo2::GetFunctionInfo2 método para descobrir a classe do pai da função, seu nome e assim por diante.

Voltar ao topo

Recursos suportados

A API de criação de perfil fornece informações sobre uma variedade de eventos e ações que ocorrem no common language runtime. Você pode usar essas informações para monitorar o funcionamento interno de processos e analisar o desempenho de seu.Aplicativo do NET Framework.

A API de criação de perfil recupera informações sobre as seguintes ações e eventos que ocorrem no CLR:

  • Eventos de inicialização e desligamento do CLR.

  • Domínio desligamento e criação de eventos do aplicativo.

  • Assembly carregar e descarregar os eventos.

  • Módulo de carregamento e descarregamento de eventos.

  • COM vtable criação e destruição de eventos.

  • Just-in-time (JIT) compilação e eventos de densidade de código.

  • Eventos de carregamento e descarregamento de classe.

  • Eventos de criação e destruição de segmento.

  • Eventos de entrada e saída da função.

  • Exceções.

  • Transições entre a execução de código gerenciado e.

  • Transições entre os contextos diferentes do tempo de execução.

  • Informações sobre as suspensões de tempo de execução.

  • Informações sobre a atividade de coleta do runtime memória heap e lixo.

A API de criação de perfil pode ser chamada a partir de qualquer linguagem de compatível com (não gerenciado).

A API é eficiente em relação ao consumo de CPU e memória. Criação de perfil não envolve as alterações para o aplicativo perfilado significativas o suficiente para causar resultados enganosos.

A API de criação de perfil é útil para criadores de perfis sampling e não de amostragem. A gerador de perfil de amostragem inspeciona o perfil de tiques do relógio regular, digamos, a distância de 5 milissegundos. A não amostragem profiler é informado de um evento de forma síncrona com o segmento que faz com que o evento.

Funcionalidade sem-suporte

A API de criação de perfil não suporta as seguintes funcionalidades:

  • Código não gerenciado, o que deve ser perfilado métodos convencionais do Win32. Entretanto, o CLR profiler inclui eventos para determinar os limites entre código gerenciado e de transição.

  • Modificação de aplicativos que modificam o seu próprio código para fins como a programação orientada a aspecto.

  • Limites de verificação, porque a API de criação de perfil não fornecer essas informações. O CLR fornece suporte intrínseca limites de verificação de todo o código gerenciado.

  • Remoto de criação de perfil, que não é suportado pelos seguintes motivos:

    • Criação de perfil remoto estende o tempo de execução. Quando você usa as interfaces de criação de perfil, você deve minimizar o tempo de execução para que os resultados de criação de perfil não serão indevidas afetada. Isso é especialmente verdadeiro quando o desempenho de execução está sendo monitorado. No entanto, a criação de perfil remoto não é uma limitação quando as interfaces de criação de perfil são usadas para monitorar o uso de memória ou para obter informações de tempo de execução sobre quadros de pilha, objetos e assim por diante.

    • O CLR profiler de código deve registrar uma ou mais interfaces de retorno de chamada com o tempo de execução no computador local no qual o aplicativo perfilado está sendo executado. Isso limita a capacidade de criar um gerador de perfil remota de código.

  • Criação de perfil em ambientes de produção com os requisitos de alta disponibilidade. A API de criação de perfil foi criada para oferecer suporte a diagnósticos em tempo de desenvolvimento. Não, ele passou a rigorosos testes necessários para oferecer suporte a ambientes de produção.

Voltar ao topo

Threads de notificação

Na maioria dos casos, o segmento que gera um evento também executa as notificações. Tais notificações (por exemplo, FunctionEnter e FunctionLeave) não é necessário fornecer explícita ThreadID. Além disso, o profiler pode decidir usar o armazenamento thread local para armazenar e atualizar seus blocos de análise em vez de indexação os blocos de análise de armazenamento global de acordo com o ThreadID do segmento afetado.

Observe que esses retornos de chamada não são serializados. Os usuários devem proteger seu código Criando estruturas de dados do thread-safe e bloqueando o código do profiler onde for necessário para impedir o acesso simultâneo de vários threads. Portanto, em alguns casos, você pode receber uma seqüência incomuns de retornos de chamada. Por exemplo, suponha que um aplicativo gerenciado está gerando dois segmentos que estão executando o código idêntico. Nesse caso, é possível receber um ICorProfilerCallback::JITCompilationStarted evento para alguma função de um thread e um FunctionEnter o retorno de chamada do thread antes de receber o ICorProfilerCallback::JITCompilationFinished retorno de chamada. Nesse caso, o usuário receberá um FunctionEnter o retorno de chamada para uma função que não tenham sido totalmente just-in-time (JIT) compilado ainda.

Voltar ao topo

Segurança

Um gerador de perfil a DLL é uma DLL não gerenciada, é executado como parte do mecanismo de execução do common language runtime. Como resultado, o código do profiler de que dll não está sujeito às restrições managed code access security. As limitações somente no profiler DLL são aquelas impostas pelo sistema operacional no usuário que está executando o aplicativo perfilado.

Os autores do Profiler devem tomar as precauções adequadas para evitar problemas de segurança. Por exemplo, durante a instalação, uma DLL do gerador de perfil deve ser adicionado a uma lista de controle de acesso (ACL) para que um usuário mal-intencionado não poderá modificá-lo.

Voltar ao topo

Combinando gerenciado e código em um gerador de perfil de código não gerenciado

Um gerador de perfil escrito incorretamente pode causar referências circulares a mesma, resultando em um comportamento imprevisível.

Uma revisão do CLR API de criação de perfil pode criar a impressão de que você pode escrever um gerador de perfil que contém os componentes gerenciados e não gerenciados que chamam uns aos outros por meio de chamadas de interoperabilidade ou indiretas COM.

Embora isso seja possível a partir de uma perspectiva de design, a API de criação de perfil não oferece suporte a componentes gerenciados. Um CLR profiler deve ser completamente não gerenciado. Tentativas de se combinar o código gerenciado e, em um CLR profiler podem causar violações de acesso, falha de programa ou deadlocks. Os componentes gerenciados do profiler acionará eventos seus componentes não gerenciados, que chamariam subseqüentemente os componentes gerenciados novamente, resultando em referências circulares.

O único local onde um CLR profiler pode chamar código gerenciado com segurança é no corpo Microsoft intermediate language (MSIL) de um método. Antes da conclusão da compilação just-in-time (JIT) de uma função, o profiler pode inserir chamadas gerenciadas no corpo de um método e compilação JIT MSIL ela (consulte a ICorProfilerInfo::GetILFunctionBody método). Essa técnica com êxito pode ser usada para instrumentação seletiva de código gerenciado ou para coletar dados de desempenho e de estatísticas sobre o JIT.

Como alternativa, um gerador de perfil de código pode inserir ganchos nativos no corpo MSIL de cada função gerenciada que chama código não gerenciado. Essa técnica pode ser usada para instrumentação e cobertura. Por exemplo, um gerador de perfil de código poderia inserir ganchos de instrumentação após cada bloco MSIL para garantir que o bloco foi executado. A modificação do corpo de um método MSIL é uma operação muito delicada e há muitos fatores que devem ser levadas em consideração.

Voltar ao topo

Definindo o perfil de código não gerenciado

O common language runtime (CLR) API para criação de perfil fornece suporte mínimo para criar o perfil de código não gerenciado. A seguinte funcionalidade é fornecida:

  • Enumeração de cadeias de pilha. Este recurso permite um gerador de perfil de código determinar a fronteira entre código gerenciado e código não gerenciado.

  • Determinação se a cadeia da pilha corresponde ao código gerenciado ou código nativo.

No.NET Framework versões 1.0 e 1.1, esses métodos estão disponíveis por meio de subconjunto da API de depuração CLR no processo. Eles são definidos no arquivo CorDebug.idl e explicados a Visão geral de depuração do CLR.

No.NET Framework 2.0 e posterior, você pode usar o ICorProfilerInfo2::DoStackSnapshot método para essa funcionalidade.

Voltar ao topo

Usando COM

Embora as interfaces de criação de perfil são definidas como interfaces COM, o common language runtime (CLR) não realmente inicializar COM usar essas interfaces. O motivo é evitar a necessidade de definir o modelo de threading usando o CoInitialize função antes do aplicativo gerenciado tenha tido a oportunidade de especificar seu desejado threading modelo. Da mesma forma, o criador de perfil em si não deve chamar CoInitialize, pois ele pode escolher um modelo de threading que é incompatível com o aplicativo que está sendo perfilado e pode fazer com que o aplicativo falhar.

Voltar ao topo

Pilhas de chamada.

A API de criação de perfil fornece duas maneiras de obter as pilhas de chamadas: um método de instantâneo da pilha, que permite a coleta esparsa de pilhas de chamadas, e um método de pilha de sombra, que controla a pilha de chamadas em todos os instantes.

Instantâneo da pilha

Um instantâneo da pilha é um rastreamento da pilha de um segmento em um instante no tempo. A API de criação de perfil suporta o rastreamento de funções gerenciadas na pilha, mas deixa o rastreamento de funções não gerenciados para o movimentador de pilha do profiler.

Para obter mais informações sobre como programar o gerador de perfil para movimentar pilhas gerenciadas, consulte o ICorProfilerInfo2::DoStackSnapshot método neste conjunto de documentação, e o Profiler empilhar caminhar sobre o.NET Framework 2.0: Noções básicas e Beyond em que o Biblioteca MSDN.

Pilha de sombra

Usando o método de instantâneo com muita freqüência pode criar rapidamente um problema de desempenho. Se você deseja levar os rastreamentos de pilha com freqüência, seu gerador de perfil em vez disso, deve criar uma pilha de sombra usando o FunctionEnter2, FunctionLeave2, FunctionTailcall2, e ICorProfilerCallback2 retornos de chamada de exceção. A pilha de sombra está sempre atualizada e rapidamente pode ser copiada para o armazenamento sempre que um instantâneo da pilha é necessária.

Uma pilha de sombra pode obter informações sobre instanciações genéricas, valores de retorno e argumentos da função. Essa informação está disponível somente através da pilha de sombra e pode ser obtida quando o controle é tratado para uma função. No entanto, essas informações podem não estar disponíveis durante a execução da função.

Voltar ao topo

Retornos de chamada e a profundidade da pilha

Retornos de chamada do Profiler podem ser emitidos em circunstâncias muito restritas a pilha e um estouro de pilha em um retorno de chamada do profiler leva a uma saída de processo de imediato. Um gerador de perfil deve certificar-se usar como pilha pouco possível em resposta a retornos de chamada. Se o criador de perfil destina-se para ser usado contra processos que são robusta contra estouro de pilha, o criador de perfil próprio também deve evitar disparar um estouro de pilha.

Voltar ao topo

Tópicos relacionados

Título

Descrição

Criação de perfil na.NET Framework 2.0

Descreve as alterações e melhorias para a criação de perfil na.NET Framework 2.0 e versões posteriores.

Configurando um ambiente de criação de perfil

Explica como inicializar um gerador de perfil, definir notificações de eventos e criar o perfil de um serviço do Windows.

Carregador de retornos de chamada da API de criação de perfil

Discute os retornos de chamada são emitidos para carregar classes, assemblies, módulos e os domínios de aplicativo.

Coleta de lixo na API de criação de perfil

Explica como a coleta de lixo é disparada, detectada e bloqueada.

A API de criação de perfil de rastreamento de objeto

Explica como objetos que foram movidos durante a coleta de lixo podem ser controlados.

Inspeção de objeto na API de criação de perfil

Explica como um gerador de perfil pode usar os metadados para obter informações sobre objetos.

A API de criação de perfil de manipulação de exceção

Discute como um gerador de perfil pode monitorar os eventos de exceção.

Geração de código na API de criação de perfil

Descreve como um gerador de perfil pode controlar a geração de código automática e manual.

Criação de perfil e IDs de notificação de tempo de execução

Descreve a classe, thread e IDs que são passados pelo common language runtime para criadores de perfis do domínio de aplicativo.

Convenções de método de API de criação de perfil

Discute os valores de retorno HRESULT, como alocar buffers de retorno para uso através da perfilação APIs e o uso dos parâmetros de saída opcional.

Interfaces de criação de perfil

Descreve as interfaces não gerenciadas que usa a API de criação de perfil.

A criação de perfil globais funções estáticas

Descreve as funções estáticas globais de não gerenciadas que usa a API de criação de perfil.

Enumerações de criação de perfil

Descreve as enumerações não gerenciadas que usa a API de criação de perfil.

Estruturas de criação de perfil

Descreve as estruturas de não gerenciadas que usa a API de criação de perfil.

Voltar ao topo