Partager via


Étendues et groupes de symboles

Un groupe de symboles contient un ensemble de symboles pour une manipulation efficace en tant que groupe. Un groupe de symboles peut être créé et rempli manuellement ou peut être généré et mis à jour automatiquement en fonction des symboles dans les étendues lexicales, telles que les variables locales et les arguments de fonction. L’interface IDebugSymbolGroup est utilisée pour représenter un groupe de symboles.

Il existe deux façons de créer un groupe de symboles. Un groupe de symboles vide est retourné par CreateSymbolGroup et le groupe de symboles de l’étendue lexicale actuelle est retourné par GetScopeSymbolGroup.

Note Le groupe de symboles généré à partir de l’étendue actuelle est un instantané des variables locales. Si une exécution se produit dans la cible, les symboles peuvent ne plus être exacts. En outre, si l’étendue actuelle change, le groupe de symboles ne représente plus l’étendue actuelle (car elle continuera de représenter l’étendue pour laquelle elle a été créée).

Les symboles peuvent être ajoutés à un groupe de symboles à l’aide d’AddSymbol et supprimés à l’aide de RemoveSymbolByIndex ou RemoveSymbolByName. La méthode OutputAsType indique au débogueur d’utiliser un type de symbole différent lors de la gestion des données d’un symbole.

Note Les valeurs des symboles délimités peuvent ne pas être exactes. En particulier, l’architecture de la machine et les optimisations du compilateur peuvent empêcher le débogueur de déterminer avec précision la valeur d’un symbole.

Les informations d’entrée de symbole sont une description d’un symbole, y compris son emplacement et son type. Pour trouver ces informations pour un symbole dans un module, utilisez IDebugSymbols3 ::GetSymbolEntryInformation. Pour trouver ces informations pour un symbole dans un groupe de symboles, utilisez IDebugSymbolGroup2 ::GetSymbolEntryInformation. Consultez DEBUG_SYMBOL_ENTRY pour plus d’informations sur l’entrée de symbole.

Les méthodes suivantes retournent des informations sur un symbole dans un groupe de symboles :

Si un symbole est stocké dans un registre ou dans un emplacement mémoire connu du moteur de débogueur, sa valeur peut être modifiée à l’aide de WriteSymbol.

Un symbole est un symbole parent s’il contient d’autres symboles. Par exemple, une structure contient ses membres. Un symbole est un symbole enfant s’il est contenu dans un autre symbole. Un symbole peut être à la fois un symbole parent et enfant. Chaque groupe de symboles a une structure plate et contient des symboles parents et leurs enfants. Chaque symbole a une profondeur : les symboles sans parents du groupe de symboles ont une profondeur de zéro, et la profondeur de chaque symbole enfant est supérieure à la profondeur de son parent. Les enfants d’un symbole parent peuvent ou non être présents dans le groupe de symboles. Lorsque les enfants sont présents dans le groupe de symboles, le symbole parent est appelé développé. Pour ajouter ou supprimer les enfants d’un symbole dans un groupe de symboles, utilisez ExpandSymbol.

Le nombre de symboles d’un groupe de symboles est retourné par GetNumberSymbols. L’index d’un symbole dans un groupe de symboles est un numéro d’identification ; l’index est compris entre zéro et le nombre de symboles moins un. Chaque fois qu’un symbole est ajouté ou supprimé d’un groupe de symboles ( par exemple, en développant un symbole), l’index de tous les symboles du groupe de symboles peut changer.

Les paramètres de symboles, y compris les informations sur les relations parent-enfant, sont disponibles à l’aide de GetSymbolParameters. Cette méthode retourne une structure DEBUG_SYMBOL_PARAMETERS .

Les symboles d’un groupe de symboles peuvent être imprimés dans le flux de sortie du débogueur à l’aide de la méthode OutputSymbols.

Étendues

L’étendue actuelle ou le contexte local actuel détermine les variables locales exposées par le moteur de débogueur. L’étendue comporte trois éléments :

  1. Cadre de pile.

  2. Instruction actuelle.

  3. Contexte de registre.

Si la trame de pile se trouve au sommet de la pile des appels, l’instruction actuelle est l’instruction qui a entraîné le dernier événement. Sinon, l’instruction actuelle est l’appel de fonction qui a entraîné la trame de pile supérieure suivante.

Les méthodes GetScope et SetScope peuvent être utilisées pour obtenir et définir l’étendue actuelle. Lorsqu’un événement se produit, le contexte actuel est défini par le cadre de l’événement. L’étendue actuelle peut être réinitialisée à l’étendue du dernier événement à l’aide de ResetScope.

Contexte de fil

Le contexte de thread est l’état conservé par Windows lors du changement de threads. Cela est similaire au contexte de registre, sauf qu’il existe un état de processeur de noyau uniquement qui fait partie du contexte de registre, mais pas le contexte de thread. Cet état supplémentaire est disponible en tant que registres pendant le débogage en mode noyau.

Le contexte de thread est représenté par la structure CONTEXT définie dans ntddk.h. Cette structure dépend de la plateforme et son interprétation dépend du type de processeur effectif. Les méthodes GetThreadContext et SetThreadContext peuvent être utilisées pour obtenir et définir le contexte de thread.