.frame (ローカル コンテキストの設定)
.frame コマンドは、ローカル変数の解釈に使用するローカル コンテキスト (スコープ) を指定するか、現在のローカル コンテキストを表示します。
.frame [/c] [/r] [FrameNumber]
.frame [/c] [/r] = BasePtr [FrameIncrement]
.frame [/c] [/r] = BasePtr StackPtr InstructionPtr
パラメーター
/c
指定されたフレームを現在のローカル オーバーライド コンテキストとして設定します。 このアクションにより、ユーザーはコール スタック内の任意の関数の不揮発性レジスタにアクセスできるようになります。
/r
指定されたローカル コンテキストに関するレジスタおよびその他の情報を表示します。
FrameNumber
ローカル コンテキストが必要なフレームの番号を指定します。 このパラメータがゼロの場合、コマンドは現在のフレームを指定します。 このパラメータを省略すると、このコマンドは現在のローカル コンテキストを表示します。
BasePtr
コマンド名 (.frame) の後に等号 (=) を追加する場合、フレームを決定するために使用されるスタック トレースのベース ポインターを指定します。 x86 ベースのプロセッサでは、BasePtr の後に別の引数 (FrameIncrement として解釈される) を追加するか、BasePtr の後にさらに 2 つの引数 (structPtr および StackPtr として解釈される) を追加します。
FrameIncrement
(x86ベースのプロセッサのみ)
ベース ポインターを超える追加のフレーム数を指定します。 たとえば、ベース ポインタ 0x0012FF00 がフレーム 3 のアドレスである場合、コマンド .frame 12ff00 は .frame 3 に相当し、.frame 12ff00 2 は .frame 5 に相当します。
StackPtr
(x86 ベースのプロセッサのみ) フレームを決定するために使用されるスタック トレースのスタック ポインターを指定します。 StackPtr と InstructionPtr を省略した場合、デバッガは esp レジスタで指定されたスタック ポインタと eip レジスタで指定された命令ポインタを使用します。
InstructionPtr
(x86 ベースのプロセッサのみ) フレームを決定するために使用されるスタック トレースの命令ポインターを指定します。 StackPtr と InstructionPtr を省略した場合、デバッガは esp レジスタで指定されたスタック ポインタと eip レジスタで指定された命令ポインタを使用します。
Environment
項目 | 説明 |
---|---|
モード | ユーザー モード、カーネル モード |
対象 | ライブ、クラッシュ ダンプ |
プラットフォーム | すべて |
追加情報
ローカル コンテキストおよびその他のコンテキスト設定の詳細については、「コンテキストの変更」を参照してください。 ローカル変数およびその他のメモリ関連コマンドを表示する方法の詳細については、「メモリの読み取りと書き込み」を参照してください。
解説
アプリケーションの実行中、ローカル変数の意味はプログラム カウンターの位置によって異なります。これは、ローカル変数のスコープが、それらが定義されている関数にのみ拡張されるためです。 .frame コマンドを使用しない場合、デバッガーは現在の関数のスコープ (スタック上の現在のフレーム) をローカル コンテキストとして使用します。
ローカル コンテキストを変更するには、.frame コマンドを使用して、必要なフレーム番号を指定します。
フレーム番号は、スタック トレース内のスタック フレームの位置です。 このスタック トレースは、k (スタック バックトレースの表示) コマンドまたは [呼び出し] ウィンドウを使用して表示できます。 最初の行 (現在のフレーム) はフレーム番号 0 です。 後続の行は、フレーム番号 1、2、3 などを表します。
k コマンドで n パラメータを使用すると、k コマンドはスタック トレースとともにフレーム番号を表示します。 これらのフレーム番号は常に 16 進数形式で表示されます。 一方、.frame コマンドは、この設定を 0x などのプレフィックスでオーバーライドしない限り、引数をデフォルトの基数で解釈します。 デフォルトの基数を変更するには、n (基数の設定) コマンドを使用します。
ローカル コンテキストを別のスタック フレームに設定すると、新しいローカル変数情報を表示できるようになります。 ただし、使用できる実際の変数は、実行されているコードによって異なります。
アプリケーションの実行が発生すると、ローカル コンテキストはプログラム カウンターのスコープにリセットされます。 レジスタ コンテキストが変更されると、ローカル コンテキストは最上位のスタック フレームにリセットされます。