Inspection d'objets dans l'API de profilage
Cette rubrique explique comment utiliser les méthodes de profilage pour inspecter des objets.
Rappels FunctionEnter2 et FunctionLeave2
Les rappels FunctionEnter2 et FunctionLeave2 fournissent des informations à propos des arguments et de la valeur de retour d'une fonction, comme régions de mémoire. Les arguments sont stockés de gauche à droite dans les régions de mémoire données. Un profileur peut utiliser la signature de métadonnées de la fonction pour interpréter les arguments, comme illustré dans le tableau suivant.
ELEMENT_TYPE |
Représentation |
---|---|
Primitives (ELEMENT_TYPE < = R8, I, U) |
Valeurs de primitives. |
Types valeur (VALUETYPE) |
Dépend du type. |
Types référence (CLASS, STRING, OBJECT, ARRAY, GENERICINST, SZARRAY) |
ObjectID (pointeur dans un tas de garbage collection). |
BYREF |
Pointeur managé (pas un ObjectID, mais peut pointer vers une pile ou un tas de garbage collection). |
PTR |
Pointeur non managé (ne peut être déplacé par garbage collection). |
FNPTR |
Valeur opaque classée selon la taille du pointeur. |
TYPEDBYREF |
Pointeur managé, suivi d'une valeur opaque classée selon la taille du pointeur. |
Les différences entre un ObjectID et un pointeur managé sont comme suit :
Les ObjectID pointent uniquement dans le tas de garbage collection ou le tas d'objets figé. Les pointeurs managés peuvent pointer également vers la pile.
Les ObjectID pointent toujours vers le début d'un objet. Les pointeurs managés peuvent pointer vers l'un des champs de l'objet.
Les pointeurs managés ne peuvent pas être passés aux fonctions qui attendent un ObjectID.
Consultez l'énumération CorElementType pour une liste des types CLR disponibles.
Inspection des types complexes
L'inspection des types référence ou des types valeur non primitifs implique des techniques avancées.
Pour les types valeur et les types référence autres que des chaînes ou des tableaux, la méthode ICorProfilerInfo2::GetClassLayout fournit l'offset pour chaque champ. Le profileur peut utiliser ensuite les métadonnées pour déterminer le type du champ et l'évaluer de manière récursive.
Remarque |
---|
GetClassLayout retourne uniquement les champs qui sont définis par la classe elle-même ; les champs qui sont définis par la classe parente ne sont pas inclus.Vous pouvez utiliser la méthode ICorProfilerInfo2::GetClassIDInfo2 pour rechercher le ClassID de la classe parente, puis utilisez GetClassLayout pour obtenir des informations à propos des champs définis par la classe parente. |
Pour les types valeur boxed, la méthode ICorProfilerInfo2::GetBoxClassLayout fournit l'offset du type valeur dans la zone (box). La disposition du type valeur elle-même ne change pas. Par conséquent, dès que le profileur a trouvé le type valeur dans la zone, il peut utiliser GetClassLayout pour comprendre sa disposition.
Pour les chaînes, la méthode ICorProfilerInfo2::GetStringLayout fournit les offsets de sous-ensembles de données intéressants dans l'objet String.
Les tableaux sont quelque peu spéciaux dans la mesure où vous devez appeler une méthode pour chaque objet de tableau au lieu de chaque type de tableau. (C'est parce qu'il existe trop de formats de tableau à décrire en utilisant des offsets.) La méthode ICorProfilerInfo2::GetArrayObjectInfo est fournie pour effectuer l'interprétation.
Inspection des champs statiques
Il existe quatre types de champs statiques. Le tableau suivant décrit ce qu'ils sont et comment les identifier.
Type statique |
Définition |
Comment il apparaît dans les métadonnées |
---|---|---|
AppDomain |
Votre champ statique de base. Il a une valeur différente dans chaque domaine d'application. |
Champ statique qui n'a pas d'attributs personnalisés attachés. |
Thread |
Stockage local des threads (TLS, Thread-Local Storage) managé. C'est un champ statique avec une valeur unique pour chaque thread et chaque domaine d'application. |
Champ statique marqué avec ThreadStaticAttribute. |
RVA |
Champ statique de portée processus avec un domicile dans la section Données du module. |
Champ statique avec l'indicateur hasRVA. |
Contexte |
Champ statique avec une valeur différente dans chaque contexte COM+. |
Champ statique marqué avec ContextStaticAttribute. |
Les méthodes ICorProfilerInfo2::GetThreadStaticAddress, ICorProfilerInfo2::GetAppDomainStaticAddress, ICorProfilerInfo2::GetContextStaticAddress et ICorProfilerInfo2::GetRVAStaticAddress fournissent des informations à propos de l'emplacement des champs statiques. En examinant la mémoire à cet emplacement, vous l'interprétez comme suit :
Types référence : ObjectID.
Types valeur : ObjectID de zone qui contient la valeur réelle.
Types primitifs : Valeur de primitive.
Référence
ICorProfilerInfo2::GetClassLayout, méthode
ICorProfilerInfo2::GetBoxClassLayout, méthode
ICorProfilerInfo2::GetStringLayout, méthode
ICorProfilerInfo2::GetArrayObjectInfo, méthode
ICorProfilerInfo2::GetThreadStaticAddress, méthode
ICorProfilerInfo2::GetAppDomainStaticAddress, méthode
ICorProfilerInfo2::GetContextStaticAddress, méthode
ICorProfilerInfo2::GetRVAStaticAddress, méthode