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


Синтаксис многопроцессора

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

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

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

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

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

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

0: kd>

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

0: kd> ~1s
1: kd>

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

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

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

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

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

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

||[Expression]

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

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

||[@$t0]

Примеры

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

1: kd> 2k 

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

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 можно использовать для отображения сведений о самих процессорах.