Compartir a través de


Ámbitos y grupos de símbolos

Un grupo de símbolos contiene un conjunto de símbolos para una manipulación eficaz como un grupo. Un grupo de símbolos se puede crear y rellenar manualmente o se puede generar y actualizar automáticamente en función de símbolos en ámbitos léxicos, como variables locales y argumentos de función. La interfaz IDebugSymbolGroup se usa para representar un grupo de símbolos.

Hay dos maneras de crear un grupo de símbolos. CreateSymbolGroup devuelve un grupo de símbolos vacío y GetScopeSymbolGroup devuelve el grupo de símbolos del ámbito léxico actual.

Nota El grupo de símbolos generado a partir del ámbito actual es una instantánea de las variables locales. Si se produce alguna ejecución en el destino, es posible que los símbolos ya no sean precisos. Además, si cambia el ámbito actual, el grupo de símbolos ya no representará el ámbito actual (porque seguirá representando el ámbito para el que se creó).

Los símbolos se pueden agregar a un grupo de símbolos mediante AddSymbol y quitarlos mediante RemoveSymbolByIndex o RemoveSymbolByName. El método OutputAsType indica al depurador que use un tipo de símbolo diferente al controlar los datos de un símbolo.

Nota Es posible que los valores de los símbolos con ámbito no sean precisos. En concreto, la arquitectura de la máquina y las optimizaciones del compilador pueden impedir que el depurador determine con precisión el valor de un símbolo.

La información de entrada del símbolo es una descripción de un símbolo, incluida su ubicación y su tipo. Para buscar esta información para un símbolo en un módulo, use IDebugSymbols3::GetSymbolEntryInformation. Para buscar esta información para un símbolo en un grupo de símbolos, use IDebugSymbolGroup2::GetSymbolEntryInformation. Consulte DEBUG_SYMBOL_ENTRY para obtener más información sobre la entrada de símbolos.

Los métodos siguientes devuelven información sobre un símbolo de un grupo de símbolos:

  • GetSymbolName devuelve el nombre del símbolo.

  • GetSymbolOffset devuelve la dirección absoluta en el espacio de direcciones virtuales del símbolo del destino, si el símbolo tiene una dirección absoluta.

  • GetSymbolRegister devuelve el registro que contiene el símbolo, si el símbolo se encuentra en un registro.

  • GetSymbolSize devuelve el tamaño de los datos del símbolo.

  • GetSymbolTypeName devuelve el nombre del tipo del símbolo.

  • GetSymbolValueText devuelve el valor del símbolo como una cadena.

Si un símbolo se almacena en un registro o en una ubicación de memoria conocida para el motor del depurador, su valor se puede cambiar mediante WriteSymbol.

Un símbolo es un símbolo primario si contiene otros símbolos. Por ejemplo, una estructura contiene sus miembros. Un símbolo es un símbolo secundario si está contenido en otro símbolo. Un símbolo puede ser un símbolo primario y secundario. Cada grupo de símbolos tiene una estructura plana y contiene símbolos primarios y sus elementos secundarios. Cada símbolo tiene una profundidad : los símbolos sin elementos primarios del grupo de símbolos tienen una profundidad de cero y la profundidad de cada símbolo secundario es una mayor que la profundidad de su elemento primario. Los elementos secundarios de un símbolo primario pueden estar presentes o no en el grupo de símbolos. Cuando los elementos secundarios están presentes en el grupo de símbolos, el símbolo primario se conoce como expandido. Para agregar o quitar los elementos secundarios de un símbolo en un grupo de símbolos, use ExpandSymbol.

GetNumberSymbols devuelve el número de símbolos de un grupo de símbolos. El índice de un símbolo de un grupo de símbolos es un número de identificación; el índice va de cero al número de símbolos menos uno. Cada vez que se agrega o quita un símbolo de un grupo de símbolos (por ejemplo, al expandir un símbolo), el índice de todos los símbolos del grupo de símbolos puede cambiar.

Los parámetros de símbolo, incluida la información sobre las relaciones de elementos primarios y secundarios, se pueden encontrar mediante GetSymbolParameters. Este método devuelve una estructura DEBUG_SYMBOL_PARAMETERS .

Los símbolos de un grupo de símbolos se pueden imprimir en el flujo de salida del depurador mediante el método OutputSymbols.

Ámbitos

El ámbito actual, o el contexto local actual, determina las variables locales expuestas por el motor del depurador. El ámbito tiene tres componentes:

  1. Marco de pila.

  2. Una instrucción actual.

  3. Contexto de registro.

Si el marco de pila está en la parte superior de la pila de llamadas, la instrucción actual es la instrucción que dio como resultado el último evento. De lo contrario, la instrucción actual es la llamada de función que dio lugar al siguiente marco de pila superior.

Los métodos GetScope y SetScope se pueden usar para obtener y establecer el ámbito actual. Cuando se produce un evento, el ámbito actual se establece en el ámbito del evento. El ámbito actual se puede restablecer al ámbito del último evento mediante ResetScope.

Contexto de subproceso

El contexto del subproceso es el estado conservado por Windows al cambiar de subprocesos. Esto es similar al contexto de registro, salvo que hay algún estado de procesador de solo kernel que forma parte del contexto de registro, pero no el contexto del subproceso. Este estado adicional está disponible como registros durante la depuración en modo kernel.

El contexto del subproceso se representa mediante la estructura CONTEXT definida en ntddk.h. Esta estructura depende de la plataforma y su interpretación depende del tipo de procesador efectivo. Los métodos GetThreadContext y SetThreadContext se pueden usar para obtener y establecer el contexto del subproceso.