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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

.thread (Set Register Context)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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