Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Группа символов содержит набор символов для эффективной манипуляции в качестве группы. Группу символов можно создать и заполнить вручную или автоматически создать и обновить на основе символов в лексических областях, таких как локальные переменные и аргументы функций. Интерфейс IDebugSymbolGroup используется для представления группы символов.
Существует два способа создания группы символов. Пустая группа символов возвращается CreateSymbolGroup, а группа символов для текущей лексической области возвращается GetScopeSymbolGroup.
Заметка Группа символов, созданная из текущей области, представляет собой моментальный снимок локальных переменных. Если в целевом объекте выполняется любое выполнение, символы больше не будут точными. Кроме того, если текущая область изменяется, группа символов больше не будет представлять текущую область (так как она будет продолжать представлять область, для которой она была создана).
Символы можно добавить в группу символов с помощью 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.
Области видимости
Текущая область или текущий локальный контекст определяет локальные переменные, предоставляемые обработчиком отладчика. Область состоит из трех компонентов:
Кадр стека.
Текущая инструкция.
Контекст регистра.
Если кадр стека находится на вершине стека вызовов, текущая инструкция — это та самая инструкция, которая привела к последнему событию. В противном случае текущая инструкция представляет собой вызов функции, который привел к более высокому уровню в стеке вызовов.
Методы GetScope и SetScope можно использовать для получения и задания текущей области. При возникновении события текущая область видимости устанавливается областью видимости события. Текущую область можно сбросить до области последнего события с помощью ResetScope.
Контекст потока
Контекст потока — это состояние, сохраненное Windows при переключении потоков. Это похоже на контекст регистра, за исключением того, что существует некоторое состояние процессора только для ядра, которое является частью контекста регистра, но не контекстом потока. Это дополнительное состояние доступно в качестве регистров во время отладки в режиме ядра.
Контекст потока представлен структурой CONTEXT, определенной в ntddk.h. Эта структура зависит от платформы и ее интерпретация зависит от эффективного типа процессора. Методы GetThreadContext и SetThreadContext можно использовать для получения и задания контекста потока.