Criação de perfil na.NET Framework 2.0
A API de criação de perfil foi aprimorada na.NET Framework versão 2.0 para fornecer recursos adicionais. A nova funcionalidade é exposta por meio de duas novas interfaces: ICorProfilerCallback2 e ICorProfilerInfo2.
Um gerador de perfil DLL que foi escrito para o.NET Framework versão 1.0 ou 1.1 não funcionará corretamente na.NET Framework 2.0 ambiente common language runtime (CLR). Para atualizar o seu gerador de perfil DLL para trabalhar com a versão 2.0 ou posterior, você deve implementar a ICorProfilerCallback2 interface. O ICorProfilerInfo2 interface herda de ICorProfilerInfo interface e introduz novos métodos oferece suporte à interação aprimorada com o CLR.
As alterações são discutidas nas seções a seguir:
Genéricos
Divisão de código
Remoção de depuração em andamento
Retornos de chamada com o Native Image Generator
Avançado retornos de chamada de coleta de lixo
Objetos congelados
Alterações de API diversas
Além de alterações de API, um HRESULT de novo, CORPROF_E_UNSUPPORTED_CALL_SEQUENCE, foi adicionado. Para obter informações sobre os cenários em que esse HRESULT pode ser retornada, consulte HRESULT DE CORPROF_E_UNSUPPORTED_CALL_SEQUENCE.
Genéricos
A introdução de genéricos no tempo de execução causou três alterações na API de criação de perfil:
Um mapeamento individual não existe mais entre typedef tokens e ClassID valores, ou entre MethodDef tokens e FunctionID valores. Isso ocorre porque cada classe ou uma função pode ser instanciada para vários tipos diferentes. Os autores do Profiler devem ler Criação de perfil e IDs de notificação de tempo de execução, examine como usar o ICorProfilerInfo::GetClassFromToken e ICorProfilerInfo::GetFunctionFromToken métodos no seu código e reescrever o seu código de maneira sensível a genéricos. A API de criação de perfil fornece dois métodos novos, ICorProfilerInfo2::GetClassFromTokenAndTypeArgs e ICorProfilerInfo2::GetFunctionFromTokenAndTypeArgs, para oferecer suporte a genéricos.
Não existe um mapeamento direto entre um FunctionID e o ClassID que ele contém. Otimizações de compartilhamento de código permitem que diferentes instanciações de um tipo genérico para compartilhar o código. Você pode determinar a ClassID de um FunctionID somente quando você examiná-los no contexto de ativação de um determinado da função.
A classe existente e os métodos de informações de função na ICorProfilerInfo interface não fornecem informações sobre argumentos de tipo para tipos genéricos e funções. O ICorProfilerInfo2::GetClassIDInfo2 e ICorProfilerInfo2::GetFunctionInfo2 métodos foram fornecidos para essa finalidade. Observe que esses métodos não podem sempre fornecer esta informação. consulte Criação de perfil e IDs de notificação de tempo de execução para obter mais informações.
Voltar ao topo
Divisão de código
Os assemblies na.NET Framework já passaram por uma otimização de desempenho. Código nativo pré-compilado foi dividido em várias regiões por função. Portanto, os existentes ICorProfilerInfo::GetCodeInfo método não é mais corretamente pode descrever a extensão de código nativo de uma função. Geradores de perfis devem alternar para o uso mais geral ICorProfilerInfo2::GetCodeInfo2 método em vez disso.
Voltar ao topo
Remoção de depuração em andamento
No.NET Framework 2.0, no processo de depuração foi substituído por um conjunto de funcionalidades que é consistente com a API de criação de perfil. O instantâneo da pilha (consulte a Visão geral de criação de perfil) e a inspeção de objeto recurso são o resultado.
Voltar ao topo
Retornos de chamada com o Native Image Generator
Otimizações significativas do Native Image Generator (NGen. exe) moveu muito mais trabalho do tempo de execução para a imagem nativa tempo de geração. Isso levou as seguintes alterações no comportamento da API de criação de perfil:
Para a maioria das funções, JITCachedFunctionSearch retornos de chamada não são recebidos em imagens nativas. Um gerador de perfil tem duas opções, dependendo de como ele usa retornos de chamada:
Se o profiler usa retornos de chamada para coletar informações sobre uma função, ele pode alternar para um esquema em que informações são coletadas sobre uma determinada função somente quando essa função é encontrada primeiro durante a execução do programa.
Se o profiler usa retornos de chamada para forçar uma função a ser just-in-time (JIT) compilado para fins de instrumentação, ele pode usar imagens nativas do profiler aprimorado. Para obter mais informações, consulte Geração de código na API de criação de perfil.
Para a maioria dos tipos, ClassLoad retornos de chamada não são recebidos em imagens nativas. Geradores de perfis devem usar técnicas de avaliação do tempo de execução (também chamado de avaliação lenta) para essas classes. Não é necessário alterar seu comportamento geradores de perfis que já estão usando o profiler aprimorado imagens nativas. No entanto, um gerador de perfil deve não alternar para imagens nativas do profiler aprimorado, a menos que ele precisa essas imagens por outros motivos porque profiler aprimorado imagens nativas são significativamente diferentes de imagens regulares.
Voltar ao topo
Avançado retornos de chamada de coleta de lixo
Os retornos de chamada de coleta de lixo foram aprimorados de diversas maneiras. Retornos de chamada notificam o profiler agora que alças de coleta de lixo tenham sido criadas ou destruído, fornecem informações sobre o enfileiramento de mensagens de objetos para ser finalizado e usar o Collect método para forçar uma coleta de lixo. O ICorProfilerCallback2::RootReferences2 método, que é uma extensão de ICorProfilerCallback::RootReferences, fornece informações sobre o tipo de cada raiz. Finalmente, o ICorProfilerCallback2::SurvivingReferences método relata o layout dos objetos na heap causado por uma coleta de lixo não compactar.
Voltar ao topo
Objetos congelados
Congelada objetos, que são novos na.NET Framework 2.0, são objetos constantes que são inicializados imagem nativa em tempo de geração e gravados na imagem nativa. Objetos congelados não são realocados pela coleta de lixo, mas eles podem ser consultados por objetos de coleta de lixo. O novo ICorProfilerInfo2::EnumModuleFrozenObjects método permite que os criadores de perfis enumerar os objetos congelados.
Voltar ao topo
Alterações de API diversas
A.NET Framework 2.0 também inclui as seguintes alterações de API:
O ICorProfilerInfo::SetFunctionReJIT método agora retorna E_NOIMPL. Em versões anteriores, chamar este método resultou em deadlock.
O novo ICorProfilerCallback2::ThreadNameChanged método fornece notificação de thread alterações de nome.
O novo ICorProfilerInfo2::GetThreadAppDomain método aceita uma ID de thread e retorna o domínio de aplicativo no qual que o thread está sendo executado.
Voltar ao topo