WinDbg および他の Windows デバッガーの条件付きブレークポイント
WinDbg やその他の Windows デバッガーの条件付きブレークポイントは、特定の条件が満たされた場合にのみブレークインする必要がある場合に役立ちます。
条件付きブレークポイントは、bp (ブレークポイントの設定) またはその他のブレークポイント コマンドへの「/w」パラメーターを使用して作成されます。 コマンドの基本的な構文は次のとおりです。
0:000> bp /w "(Condition)" Address
ブレークポイントは、指定された条件が true の場合にのみデバッガーにブレークを引き起こします。 「w」は「when」の略です。 条件式には、dx (デバッガー オブジェクト モデル式の表示) コマンドで使用できるものであれば何でも使用できます。 これには、比較、算術演算、ポインター操作などを含む、ほとんどの C++ スタイルの式が含まれます。 たとえば、変数が 20 を超えた場合にのみブレークインする基本的な条件付きブレークポイントは、次のように記述できます。
0:000> bp /w "MyVar > 20" `mysource.cpp:143`
条件はデバッガー オブジェクト モデルを使用して評価されるため、NatVis サポートなどを利用することもできます。 たとえば、 myVec がstd::vector<int>
であると仮定すると、次のような条件を作成できます。
0:000> bp /w "myVec.Count() == 4" `mysource.cpp:143`
これは、myVec 変数に 4 つの要素があるときに mysource.cpp の 143 行目が実行されると中断されます。
natvis 以外にも、JavaScript 関数を呼び出すこともできます。 WinDbg スクリプト ウィンドウ、または「myFunc」という関数を含む .scriptload (スクリプトのロード) コマンドを使用してスクリプトをロードする場合は、次のようにブレークポイントを設定できます。
0:000> bp /w "@$scriptContents.myFunc()" `mysource.cpp:143`
デバッガーでの JavaScript 関数と拡張機能の作成の詳細については、「JavaScript デバッガーのスクリプト作成」を参照してください。
通常、高レベルの式が最も便利ですが、これらの式を使用してレジスタを評価することもできます。 たとえば、スタック ポインタが何らかのしきい値に達した場合にのみトリガーされるブレークポイントを作成できます。
0:000> bp /w "@esp < 0x6ff9f8" `mysource.cpp:143`
従来の条件付きブレークポイント構文
ブレークポイント コマンドに「/w」パラメータが使用できるようになる前は、条件付きブレークポイントを設定する推奨方法は、j (Execute If - Else) コマンドまたは .if トークンの後に gc (Go from Conditional Breakpoint) を使用することでした。 条件付きブレークポイントを設定するこれらの方法は推奨されなくなりましたが、依然として機能しており、この構文が他のソースで参照されている場合があります。
j コマンドを使用した条件付きブレークポイントの基本構文は次のとおりです。
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
.if トークンを使用した条件付きブレークポイントの基本構文は次のとおりです。
0:000> bp Address ".if (Condition) {OptionalCommands} .else {gc}"