.step_filter (ステップ フィルターの設定)
.step_filter コマンドは、トレース時にスキップ (ステップ オーバー) される関数の一覧を作成します。 これにより、コードをトレースし、特定の関数のみをスキップできます。 また、ソース モードで使用して、1 行に複数の関数呼び出しがある場合のステップ実行を制御することもできます。
.step_filter "FilterList"
.step_filter /c
.step_filter
パラメーター
"FilterList"
ステップ オーバーする関数に関連付けられているシンボルを指定します。 FilterList には、セミコロンで区切られた任意の数のテキスト パターンを含めることができます。 これらの各パターンには、さまざまなワイルドカードと指定子を含めることができます。詳細については、「文字列のワイルドカードの構文」を参照してください。 シンボルがこれらのパターンの少なくとも 1 つに一致する関数は、トレース中にステップ オーバーされます。 "FilterList" が使用されるたびに、以前のフィルター リストは破棄され、完全に新しいリストに置き換えられます。
/c
フィルター リストをクリアします。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
解説
.step_filter にパラメーターを指定しなかった場合は、現在のフィルター一覧が表示されます。
通常、トレース コマンド (例: t または windbg debug | step into) の追跡範囲は、関数呼び出しの内部にまで及びます。 ただし、呼び出される関数に関連付けられているシンボルが FilterList で指定されたパターンと一致する場合、ステップ コマンド (pなど) が使用されたかのように、関数はステップ オーバーされます。
フィルター リストに記述されているコード内に命令ポインターがある場合、トレースまたはステップ コマンドは、gu コマンドや WinDbg のステップ アウト ボタンが作動したかのように、この関数からステップ アウトします。 当然、そのような場合でも、コードの内部にまで及ぶ追跡はそもそもフィルターによって回避されるため、これが発生するのは、フィルターを変更した場合やブレークポイントに到達した場合に限られます。
たとえば、次のコマンドを実行すると、トレース コマンドはすべての CRT 呼び出しをスキップします。
.step_filter "msvcrt!*"
.step_filter コマンドの利便性が最も発揮されるのは、ソース モードでのデバッグ時です。1 つのソース行に複数の関数呼び出しが存在する可能性があるためです。 p コマンドや t コマンドでは、これらの関数呼び出しを区別することができません。
たとえば、次の行があった場合、t コマンドは GetTickCount と printf の両方にステップ インし、また、p コマンドは両方の関数呼び出しをステップ オーバーしてしまいます。
printf( "%x\n", GetTickCount() );
.step_filter コマンドを使用すると、これらの呼び出しのいずれかをフィルターで除外しながら、もう一方の呼び出しをトレースすることができます。
関数はシンボルによって識別されるため、1 つのフィルターでモジュール全体を対象にすることができます。 これにより、フレームワーク関数、たとえば、Microsoft Foundation Classes (MFC) や Active Template Library (ATL) 呼び出しを除外できます。
アセンブリ モードでデバッグする場合、各呼び出しは異なる行に配置されるため、1 行ずつステップ実行するかトレースするかを選択できます。 したがって、.step_filter はアセンブリ モードではあまり役に立ちません。