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


Многопроцессорный синтаксис

KD и WinDbg в режиме ядра поддерживают отладку нескольких процессоров. Такой вид отладки можно выполнить на любой многопроцессорной платформе.

Процессоры нумеруются от нуля до n.

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

Выбор обработчика

Для отображения номеров процессоров текущего процессора можно использовать команду .echocpunum (Показать номер ЦП ). Выходные данные этой команды позволяют сразу же определить, когда вы работаете в системе с несколькими процессорами, с помощью текста в командной строке отладки ядра.

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

0: kd>

Используйте команду ~s (Изменить текущий процессор) для переключения между процессорами, как показано в следующем примере.

0: kd> ~1s
1: kd>

Теперь выполняется отладка второго процессора на компьютере.

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

Указание процессоров в других командах

Номер процессора можно добавить перед несколькими командами. Этому числу не предшествует тильда (~), за исключением команды ~S .

Примечание При отладке в пользовательском режиме тильда используется для указания потоков. Дополнительные сведения об этом синтаксисе см. в разделе Синтаксис потока.

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

||[Expression]

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

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

||[@$t0]

Примеры

В следующем примере используется команда k (Display Stack Backtrace) для отображения трассировки стека от процессора 2.

1: kd> 2k 

В следующем примере используется команда r (Registers) для отображения регистра eax для процессора 3.

1: kd> 3r eax 

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

1: kd> 3r eax=808080 

Точки останова

Во время отладки ядра команды bp, bu, bm (Set Breakpoint) и ba (Break on Access) применяются ко всем процессорам компьютера с несколькими процессорами.

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

1: kd> bp SomeAddress 

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

Отображение сведений о процессоре

Вы можете использовать расширение !running для отображения состояния каждого процессора на целевом компьютере. Для каждого процессора !running также может отображать поля текущего и следующего потока из блока управления процессом (PRCB), состояние 16 встроенных спин-блокировок в очереди и трассировку стека.

Для отображения сведений о самих процессорах можно использовать расширения !cpuinfo и !cpuid .