Inspeção de objeto na API de criação de perfil
Este tópico discute como usar os métodos de criação de perfil para inspecionar os objetos.
FunctionEnter2 e retornos de chamada de FunctionLeave2
O FunctionEnter2 e FunctionLeave2 retornos de chamada fornecem informações sobre os argumentos e retornar o valor de uma função, como regiões de memória. Os argumentos são armazenados da esquerda para a direita nas regiões de memória de determinado. Um gerador de perfil pode usar a assinatura de metadados da função para interpretar os argumentos, como mostrado na tabela a seguir.
ELEMENT_TYPE |
Representação |
---|---|
Primitives (ELEMENT_TYPE <= R8, I, U) |
Valores primitivos. |
Tipos de valor (VALUETYPE) |
Depende do tipo. |
Reference types (CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY) |
ObjectID(ponteiro em uma pilha de coleta de lixo). |
BYREF |
Ponteiro gerenciado (não um ObjectID, mas pode estar apontando para uma pilha de coleta de lixo ou pilha). |
PTR |
Ponteiro não gerenciado (não Movível pela coleta de lixo). |
FNPTR |
Tamanho do ponteiro valor opaco. |
TYPEDBYREF |
Gerenciado ponteiro, seguido por um valor de opaco de tamanho do ponteiro. |
As diferenças entre um ObjectID e um ponteiro gerenciado são as seguintes:
ObjectIDponto de s somente no heap de coleta de lixo ou heap de objeto congeladas. Ponteiros gerenciados também podem apontar para a pilha.
ObjectIDs sempre apontar para o início de um objeto. Ponteiros gerenciados podem apontar para um dos campos do objeto.
Ponteiros gerenciados não podem ser passados para funções que esperam um ObjectID.
Consulte o CorElementType enumeração para obter uma lista dos tipos CLR disponíveis.
Inspecionando tipos complexos
Inspecionar tipos de referência ou tipos de valor não primitivo envolve algumas técnicas avançadas.
Para tipos de valor e tipos de referência diferente, por exemplo, seqüências de caracteres ou matrizes, o ICorProfilerInfo2::GetClassLayout método fornece o deslocamento para cada campo. O profiler pode usar metadados para determinar o tipo do campo e recursivamente avaliá-lo.
Observação
GetClassLayoutRetorna somente os campos que são definidos pela classe em si; campos que são definidos pela classe pai não são incluídos.Você pode usar o ICorProfilerInfo2::GetClassIDInfo2 método para localizar o ClassID da classe pai e em seguida, use GetClassLayout para obter informações sobre os campos definidos pela classe do pai.
Para tipos de valor convertidos, o ICorProfilerInfo2::GetBoxClassLayout método fornece o deslocamento do tipo de valor dentro da caixa. Não altera o layout do tipo de valor. Portanto, assim que o profiler encontrou o tipo de valor dentro da caixa, ele pode usar GetClassLayout para entender o layout.
Para seqüências de caracteres, o ICorProfilerInfo2::GetStringLayout método fornece os deslocamentos de partes interessantes de dados no objeto de seqüência de caracteres.
Arrays são um pouco especiais, você deve chamar um método para cada objeto de matriz em vez de cada tipo de matriz. (Isso é porque há muitos formatos de matriz para descrever por meio de deslocamentos). O ICorProfilerInfo2::GetArrayObjectInfo método é fornecido para fazer a interpretação.
Inspecionando campos estáticos
Há quatro tipos de campos estáticos. A tabela a seguir descreve o que são e como identificá-los.
Tipo estático |
Definição |
Como ele aparece nos metadados |
---|---|---|
AppDomain |
O campo estático básico. Ele tem um valor diferente em cada domínio de aplicativo. |
Campo estático que não tenha conectado os atributos personalizados. |
Thread |
Armazenamento local de segmento gerenciado (TLS). Este é um campo estático com um valor exclusivo para cada segmento e cada domínio de aplicativo. |
Campo estático marcado com ThreadStaticAttribute. |
RVA |
Escopo do processo o campo estático uma casa na seção de dados do módulo. |
Campo estático com hasRVA sinalizador. |
Contexto |
Campo estático com um valor diferente em cada contexto COM+. |
Campo estático marcado com ContextStaticAttribute. |
O ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddress, e ICorProfilerInfo2::GetRVAStaticAddress métodos fornecem informações sobre a localização dos campos estáticos. Você olhando para a memória nesse local, interpretá-lo da seguinte maneira:
Tipos de referência: ObjectID.
Tipos de valor: ObjectIDda caixa que contém o valor real.
Tipos primitivos: Valor primitivo.
Referência
Método de ICorProfilerInfo2::GetClassLayout
Método de ICorProfilerInfo2::GetBoxClassLayout
Método de ICorProfilerInfo2::GetStringLayout
Método de ICorProfilerInfo2::GetArrayObjectInfo
Método de ICorProfilerInfo2::GetThreadStaticAddress
Método de ICorProfilerInfo2::GetAppDomainStaticAddress
Método de ICorProfilerInfo2::GetContextStaticAddress
Método de ICorProfilerInfo2::GetRVAStaticAddress