Области и группы символов

Группа символов содержит набор символов для эффективного манипулирования как группой. Группу символов можно создать и заполнить вручную или автоматически создать и обновить на основе символов в лексических областях, таких как локальные переменные и аргументы функции. Интерфейс IDebugSymbolGroup используется для представления группы символов.

Существует два способа создания группы символов. CreateSymbolGroup возвращает пустую группу символов, а группу символов для текущего лексического область возвращает GetScopeSymbolGroup.

Примечание Группа символов, созданная на основе текущего область, является snapshot локальных переменных. Если в целевом объекте выполняется какое-либо выполнение, символы могут быть неточными. Кроме того, при изменении текущего область группа символов больше не будет представлять текущую область (так как она будет по-прежнему представлять область, для которой она была создана).

Символы можно добавить в группу символов с помощью AddSymbol и удалить с помощью RemoveSymbolByIndex или RemoveSymbolByName. Метод OutputAsType указывает отладчику использовать другой тип символа при обработке данных символа.

Примечание Значения символов с заданной областью могут быть неверными. В частности, архитектура компьютера и оптимизация компилятора могут помешать отладчику точно определить значение символа.

Сведения о вводе символа — это описание символа, включая его расположение и тип. Чтобы найти эти сведения для символа в модуле, используйте IDebugSymbols3::GetSymbolEntryInformation. Чтобы найти эти сведения для символа в группе символов, используйте IDebugSymbolGroup2::GetSymbolEntryInformation. Дополнительные сведения о вводе символов см. в DEBUG_SYMBOL_ENTRY .

Следующие методы возвращают сведения о символе в группе символов:

  • GetSymbolName возвращает имя символа.

  • GetSymbolOffset возвращает абсолютный адрес в виртуальном адресном пространстве целевого символа, если символ имеет абсолютный адрес.

  • GetSymbolRegister возвращает регистр, содержащий символ, если символ содержится в регистре.

  • GetSymbolSize возвращает размер данных для символа.

  • GetSymbolTypeName возвращает имя типа символа.

  • GetSymbolValueText возвращает значение символа в виде строки.

Если символ хранится в регистре или в расположении памяти, известном обработчику отладчика, его значение можно изменить с помощью WriteSymbol.

Символ является родительским символом , если он содержит другие символы. Например, структура содержит ее члены. Символ является дочерним символом , если он содержится в другом символе. Символ может быть родительским и дочерним символом. Каждая группа символов имеет плоскую структуру и содержит родительские символы и их дочерние элементы. Каждый символ имеет глубину — символы без родительских элементов в группе символов имеют нулевую глубину, а глубина каждого дочернего символа на единицу больше глубины родительского символа. Дочерние элементы родительского символа могут присутствовать или отсутствоть в группе символов. Если дочерние элементы присутствуют в группе символов, родительский символ называется развернутым. Чтобы добавить или удалить дочерние элементы символа в группе символов, используйте команду ExpandSymbol.

Количество символов в группе символов возвращается методом GetNumberSymbols. Индекс символа в группе символов — это идентификационный номер; индекс в диапазоне от нуля до числа символов минус один. Каждый раз, когда символ добавляется в группу символов или удаляется из нее( например, путем расширения символа), индекс всех символов в группе символов может меняться.

Параметры символов, включая сведения о связях "родители-потомки", можно найти с помощью getSymbolParameters. Этот метод возвращает структуру DEBUG_SYMBOL_PARAMETERS .

Символы в группе символов можно распечатать в выходном потоке отладчика с помощью метода OutputSymbols.

Области

Текущий область или текущий локальный контекст определяет локальные переменные, предоставляемые обработчиком отладчика. Область состоит из трех компонентов:

  1. Кадр стека.

  2. Текущая инструкция.

  3. Контекст регистрации.

Если кадр стека находится в верхней части стека вызовов, текущая инструкция — это инструкция, которая привела к последнему событию. В противном случае текущей инструкцией является вызов функции, который приводит к следующему более высокому кадру стека.

Методы GetScope и SetScope можно использовать для получения и задания текущего область. При возникновении события для текущего область устанавливается область события. Текущий область можно сбросить до область последнего события с помощью ResetScope.

Контекст потока

Контекст потока — это состояние, сохраняемое Windows при переключении потоков. Это похоже на контекст регистра, за исключением того, что существует некоторое состояние процессора только для ядра, которое является частью контекста регистра, но не контекста потока. Это дополнительное состояние доступно в виде регистров во время отладки в режиме ядра.

Контекст потока представлен структурой CONTEXT, определенной в ntddk.h. Эта структура зависит от платформы, и ее интерпретация зависит от эффективного типа процессора. Методы GetThreadContext и SetThreadContext можно использовать для получения и задания контекста потока.