Поделиться через


Изменение контекстов

В отладке в режиме ядра существует множество процессов, потоков и иногда пользовательских сеансов, выполняемых одновременно. Таким образом, такие фразы, как "виртуальный адрес 0x80002000" или " регистр eax ", являются неоднозначными. Необходимо указать контекст , в котором можно понять такие фразы.

Отладчик имеет пять разных контекстов, которые можно задать при отладке:

  1. Контекст сеанса указывает сеанс пользователя по умолчанию.

  2. Контекст процесса определяет, как отладчик интерпретирует виртуальные адреса.

  3. Контекст адреса в пользовательском режиме почти никогда не устанавливается напрямую. Этот контекст автоматически устанавливается при изменении контекста процесса.

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

  5. Локальный контекст определяет, как отладчик интерпретирует локальные переменные. Этот контекст также называется область.

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

Одновременно может выполняться несколько сеансов входа. Каждый сеанс входа имеет собственные процессы.

Расширение !session отображает все сеансы входа или изменяет текущий контекст сеанса.

Контекст сеанса используется расширениями !sprocess и !spoolused при вводе номера сеанса как "-2".

При изменении контекста сеанса контекст процесса автоматически изменяется на активный процесс для этого сеанса.

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

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

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

Во время отладки в режиме ядра можно задать контекст процесса с помощью команды .process (Set Process Context). Эта команда позволяет выбрать каталог страницы процесса для интерпретации виртуальных адресов. После установки контекста процесса этот контекст можно использовать в любой команде, которая принимает адреса. Вы даже можете задать точки останова на этом адресе. Включив параметр /i в команду .process для указания инвазивной отладки, можно также использовать отладчик ядра для задания точек останова в пользовательском пространстве.

Вы также можете задать точки останова в пользовательском режиме из отладчика ядра с помощью точки останова для конкретной процесса функции пространства ядра. Задайте стратегические точки останова и дождитесь появления соответствующего контекста.

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

При настройке контекста процесса во время отладки в режиме ядра этот контекст процесса сохраняется до тех пор, пока другая команда процесса не изменит контекст. Контекст адреса в пользовательском режиме также сохраняется, пока команда .process или .context не изменит ее. Эти контексты не изменяются при выполнении целевого компьютера, и они не затрагиваются изменениями в контексте регистрации или локальном контексте.

Регистрация контекста

Каждый поток имеет собственные значения регистра. Эти значения хранятся в регистрах ЦП при выполнении потока и хранятся в памяти при выполнении другого потока.

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

Контекст регистрации можно изменить на значение, отличное от текущего потока при отладке в пользовательском режиме, с помощью одной из следующих команд:

.cxr (отображаемая запись контекста)

.ecxr (отображаемая запись контекста исключения)

Во время отладки в режиме ядра можно управлять контекстом регистрации с помощью различных команд отладчика, включая следующие команды:

.thread (настройка контекста регистрации)

.cxr (отображаемая запись контекста)

.trap (отображение кадра ловушки)

Эти команды не изменяют значения регистров ЦП. Вместо этого отладчик извлекает указанный контекст регистра из его расположения в памяти. Фактически отладчик может получить только сохраненные значения регистра. (Другие значения задаются динамически и не сохраняются. Сохраненные значения достаточно для повторного создания трассировки стека.

После установки контекста регистрации новый контекст регистра используется для всех команд, использующих значения регистра, например k (Display Stack Backtrace) и r (Registers).

Однако при отладке многопроцессорных компьютеров некоторые команды позволяют указать процессор. (Дополнительные сведения об таких командах см. в разделе Синтаксис многопроцессора.) Если вы указываете обработчик для команды, команда использует контекст регистра активного потока на указанном процессоре вместо текущего контекста регистра, даже если указанный процессор является текущим активным процессором.

Кроме того, если контекст регистра не соответствует текущему параметру режима процессора, эти команды создают неправильные или бессмысленные выходные данные. Чтобы избежать ошибок выходных данных, команды, зависящие от состояния регистрации, завершаются ошибкой, пока не измените режим процессора в соответствии с контекстом регистрации. Чтобы изменить режим процессора, используйте команду .effmach (действующий компьютер),

Изменение контекста регистрации также может изменить локальный контекст. Таким образом, контекст регистра может повлиять на отображение локальных переменных.

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

Контекст регистра влияет на трассировки стека, так как трассировка стека начинается в расположении, на которое указывает регистр указателя стека (esp на процессор на основе x86). Если контекст регистра имеет недопустимое или недоступное значение, трассировки стека не могут быть получены.

Вы можете применить точку останова процессора (точку останова данных) к определенному контексту регистра с помощью команды .apply_dbp (применение точки останова данных к контексту).

Локальный контекст

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

При отладке пользовательского режима или режима ядра отладчик использует область текущей функции (текущий кадр в стеке) в качестве локального контекста. Чтобы изменить этот контекст, используйте команду .frame (Задать локальный контекст) или дважды щелкните нужный кадр в окне "Вызовы".

При отладке в пользовательском режиме локальный контекст всегда является кадром в трассировке стека текущего потока. В отладке в режиме ядра локальный контекст всегда является кадром в трассировке стека потока текущего контекста регистра.

Для локального контекста можно использовать только один кадр стека. Доступ к локальным переменным в других кадрах невозможен.

Локальный контекст сбрасывается, если происходят какие-либо из следующих событий:

  • Любое выполнение программы, пошаговое выполнение или трассировка

  • Любое использование разделителя потока (~) в любой команде

  • Любое изменение контекста регистрации

Расширение !for_each_frame позволяет многократно выполнять одну команду для каждого кадра в стеке. Эта команда изменяет локальный контекст для каждого кадра, выполняет указанную команду, а затем возвращает локальный контекст в исходное значение.