マルチプロセッサの構文

KD とカーネル モード WinDbg では、複数のプロセッサ デバッグがサポートされています。 この種のデバッグは、任意のマルチプロセッサ プラットフォームで実行できます。

プロセッサには、0 から n までの番号が付けられます。

現在のプロセッサがプロセッサ 0 の場合 (つまり、現在デバッガーがアクティブになっているプロセッサの場合)、他の現在以外のプロセッサ (プロセッサ 1 から n) を調べることができます。 ただし、現在以外のプロセッサでは何も変更できません。 状態の表示のみ行うことができます。

プロセッサの選択

.echocpunum (CPU 番号の表示) コマンドを使用して、現在のプロセッサのプロセッサ番号を表示できます。 このコマンドからの出力を使用すると、カーネル デバッグ プロンプトのテキストにより、複数のプロセッサ システムで作業するタイミングをすぐに確認することができます。

次の例では、kd> プロンプトの前に 0: があり、これはコンピューターの最初のプロセッサをデバッグしていることを示しています。

0: kd>

次の例に示すように、~s (現在のプロセッサの変更) コマンドを使用してプロセッサを切り替えます。

0: kd> ~1s
1: kd>

次に、コンピューターの 2 番目のプロセッサをデバッグします。

中断が発生したが、スタック トレースを理解できない場合は、マルチプロセッサ システムのプロセッサを変更する必要がある場合があります。 中断が別のプロセッサで発生した可能性があります。

その他のコマンドでのプロセッサの指定

複数のコマンドの前にプロセッサ番号を追加できます。 ~S コマンドを除き、この数値の前にはチルダ (~) は付いていません。

ユーザー モード デバッグでは、チルダを使用してスレッドを指定します。 この構文の詳細については、「スレッド構文」をご覧ください。

プロセッサ ID を明示的に参照する必要はありません。 代わりに、プロセッサ ID に対応する整数に解決される数値式を使用できます。 式をプロセッサとして解釈する必要があることを示すには、次の構文を使用します。

||[Expression]

この構文では、角かっこが必要です。Expression は、プロセッサ ID に対応する整数に解決される任意の数値式を表します。

次の例では、プロセッサはユーザー定義の擬似レジスタの値に応じて変化します。

||[@$t0]

次の例では、k (スタック バックトレースの表示) コマンドを使用して、プロセッサ 2 からのスタック トレースを表示します。

1: kd> 2k 

次の例では、r (レジスタ) コマンドを使用して、プロセッサ 3 の eax レジスタを表示します。

1: kd> 3r eax 

ただし、現在のプロセッサ以外のプロセッサの状態を変更できないため、次のコマンドでは構文エラーが発生します。

1: kd> 3r eax=808080 

ブレークポイント

カーネル デバッグ時、bp、bu、bm (ブレークポイントの設定) および ba (アクセスの中断) コマンドは、複数のプロセッサ コンピューターのすべてのプロセッサに適用されます。

たとえば、現在のプロセッサが 3 の場合、次のコマンドを入力して SomeAddress にブレークポイントを設定できます。

1: kd> bp SomeAddress 

その後、そのアドレスで実行されるすべてのプロセッサ (プロセッサ 1 だけでなく) によってブレークポイント トラップが発生します。

プロセッサ情報の表示

!running 拡張を使用すると、ターゲット コンピューター上の各プロセッサのステータスを表示できます。 !running は、プロセッサごとに、プロセス制御ブロック (PRCB) の現在および次のスレッド フィールド、16 個の組み込みのキューに登録されたスピンロックの状態、スタック トレースを表示することもできます。

!cpuinfo および !cpuid 拡張を使用して、プロセッサ自体に関する情報を表示できます。