Escopos e grupos de símbolos

Um grupo de símbolos contém um conjunto de símbolos para manipulação eficiente como um grupo. Um grupo de símbolos pode ser criado e preenchido manualmente ou pode ser gerado e atualizado automaticamente com base em símbolos em escopos léxicos, como variáveis locais e argumentos de função. A interface IDebugSymbolGroup é usada para representar um grupo de símbolos.

Há duas maneiras de criar um grupo de símbolos. Um grupo de símbolos vazio é retornado por CreateSymbolGroup e o grupo de símbolos para o escopo lexical atual é retornado por GetScopeSymbolGroup.

Nota O grupo de símbolos gerado a partir do escopo atual é um instantâneo das variáveis locais. Se qualquer execução ocorrer no destino, os símbolos poderão não ser mais precisos. Além disso, se o escopo atual for alterado, o grupo de símbolos não representará mais o escopo atual (porque continuará a representar o escopo para o qual foi criado).

Os símbolos podem ser adicionados a um grupo de símbolos usando AddSymbol e removidos usando RemoveSymbolByIndex ou RemoveSymbolByName. O método OutputAsType instrui o depurador a usar um tipo de símbolo diferente ao manipular os dados de um símbolo.

Nota Os valores para símbolos com escopo podem não ser precisos. Em particular, a arquitetura do computador e as otimizações do compilador podem impedir que o depurador determine com precisão o valor de um símbolo.

As informações de entrada de símbolo são uma descrição de um símbolo, incluindo sua localização e seu tipo. Para encontrar essas informações para um símbolo em um módulo, use iDebugSymbols3::GetSymbolEntryInformation. Para encontrar essas informações para um símbolo em um grupo de símbolos, use IDebugSymbolGroup2::GetSymbolEntryInformation. Consulte DEBUG_SYMBOL_ENTRY para obter detalhes das informações de entrada de símbolo.

Os métodos a seguir retornam informações sobre um símbolo em um grupo de símbolos:

  • GetSymbolName retorna o nome do símbolo.

  • GetSymbolOffset retorna o endereço absoluto no espaço de endereço virtual do símbolo do destino, se o símbolo tiver um endereço absoluto.

  • GetSymbolRegister retornará o registro que contém o símbolo, se o símbolo estiver contido em um registro.

  • GetSymbolSize retorna o tamanho dos dados do símbolo.

  • GetSymbolTypeName retorna o nome do tipo do símbolo.

  • GetSymbolValueText retorna o valor do símbolo como uma cadeia de caracteres.

Se um símbolo for armazenado em um registro ou em um local de memória conhecido pelo mecanismo do depurador, seu valor poderá ser alterado usando WriteSymbol.

Um símbolo será um símbolo pai se contiver outros símbolos. Por exemplo, uma estrutura contém seus membros. Um símbolo será um símbolo filho se ele estiver contido em outro símbolo. Um símbolo pode ser um símbolo pai e filho. Cada grupo de símbolos tem uma estrutura plana e contém símbolos pai e seus filhos. Cada símbolo tem uma profundidade - símbolos sem pais no grupo de símbolos têm uma profundidade de zero, e a profundidade de cada símbolo filho é uma maior que a profundidade de seu pai. Os filhos de um símbolo pai podem ou não estar presentes no grupo de símbolos. Quando os filhos estão presentes no grupo de símbolos, o símbolo pai é chamado de expandido. Para adicionar ou remover os filhos de um símbolo em um grupo de símbolos, use ExpandSymbol.

O número de símbolos em um grupo de símbolos é retornado por GetNumberSymbols. O índice de um símbolo em um grupo de símbolos é um número de identificação; o índice varia de zero até o número de símbolos menos um. Cada vez que um símbolo é adicionado ou removido de um grupo de símbolos , por exemplo, expandindo um símbolo - o índice de todos os símbolos no grupo de símbolos pode ser alterado.

Os parâmetros de símbolo, incluindo informações sobre relações pai-filho, podem ser encontrados usando GetSymbolParameters. Esse método retorna uma estrutura DEBUG_SYMBOL_PARAMETERS .

Os símbolos em um grupo de símbolos podem ser impressos no fluxo de saída do depurador usando o método OutputSymbols.

Escopos

O escopo atual ou o contexto local atual determina as variáveis locais expostas pelo mecanismo do depurador. O escopo tem três componentes:

  1. Um registro de ativação.

  2. Uma instrução atual.

  3. Um contexto de registro.

Se o quadro de pilha estiver na parte superior da pilha de chamadas, a instrução atual será a instrução que resultou no último evento. Caso contrário, a instrução atual é a chamada de função que resultou no próximo quadro de pilha superior.

Os métodos GetScope e SetScope podem ser usados para obter e definir o escopo atual. Quando ocorre um evento, o escopo atual é definido como o escopo do evento. O escopo atual pode ser redefinido para o escopo do último evento usando ResetScope.

Contexto de thread

O contexto de thread é o estado preservado pelo Windows ao alternar threads. Isso é semelhante ao contexto de registro, exceto que há algum estado de processador somente kernel que faz parte do contexto de registro, mas não do contexto de thread. Esse estado extra está disponível como registros durante a depuração do modo kernel.

O contexto de thread é representado pela estrutura CONTEXT definida em ntddk.h. Essa estrutura depende da plataforma e sua interpretação depende do tipo de processador efetivo. Os métodos GetThreadContext e SetThreadContext podem ser usados para obter e definir o contexto do thread.