レジスター
デバッガー エンジンを使用して、ターゲットのレジスタを検査および変更できます。
ターゲットで使用できるレジスタは、そのプロセッサ アーキテクチャによって異なります。 x86 プロセッサのレジスタの説明については、「プロセッサ アーキテクチャ」を参照してください。 プロセッサで使用できるレジスタの詳細については、そのプロセッサのドキュメントを参照してください。
レジスタセット
GetNumberRegisters メソッドを使用すると、ターゲット上のレジスタの数を見つけることができます。
各レジスタはインデックスによって参照されます。 最初のレジスタのインデックスは 0 で、最後のレジスタのインデックスはレジスタの数から 1 を引いたものになります。 名前がわかっているレジスタのインデックスを検索するには、GetIndexByName を使用します。
GetDescription メソッドは、レジスタに関する情報を返します。 これには、レジスタの名前、レジスタが保持できる値のタイプ、およびサブレジスタかどうかが含まれます。
サブレジスタは、別のレジスタ内に含まれるレジスタです。 サブレジスタが変更されると、それを含むレジスタも変更されます。 たとえば、x86 プロセッサでは、ax サブレジスタは 32 ビット eax レジスタの下位 16 ビットと同じです。
以下の方法を使用して値を見つけることができる特殊レジスターが 3 つあります。 これらのレジスタの値の解釈はプラットフォームに依存します。
現在の命令の位置は、GetInstructionOffset および GetInstructionOffset2 で見つけることができます。
現在のプロセッサ スタック スロットの位置は、GetStackOffset および GetStackOffset2 で見つけることができます。
現在の関数のスタック フレームの場所は、GetFrameOffset および GetFrameOffset2 で見つけることができます。
レジスタの操作
レジスタの値は、GetValue メソッドを使用して読み取ることができます。 GetValues および GetValues2 を使用して複数のレジスタを読み取ることができます。
SetValue メソッドを使用してレジスタに値を書き込むことができます。 SetValues および SetValues2 を使用して複数のレジスタに書き込むことができます。
レジスタに値を書き込むとき、指定された値の型がレジスタの型と異なる場合、値はレジスタの型に変換されます。 この変換は、CoerceValue メソッドによって実行される変換と同じです。 レジスタの型が指定された値を保持できない場合、この変換によりデータが失われる可能性があります。
擬似レジスタ
擬似レジスタは、特定の値を保持するデバッガ エンジンによって維持される変数です。たとえば、$teb は、値が現在のスレッドのスレッド環境ブロック (TEB) のアドレスである擬似レジスタの名前です。 詳細および疑似レジスタのリストについては、「疑似レジスタの構文」を参照してください。
各擬似レジスタにはインデックスがあります。 インデックスは、0 から疑似レジスタの数 (GetNumberPseudoRegisters によって返される) から 1 を引いた数までの数値です。 疑似レジスタのインデックスを名前で検索するには、GetPseudoIndexByName を使用します。 擬似レジスタの値は GetPseudoValues を使用して読み取ることができ、値は SetPseudoValues を使用して擬似レジスタに書き込むことができます。 疑似レジスタの説明 (タイプを含む) については、GetPseudoDescription を使用してください。
注 すべてのデバッグ セッションまたは特定のセッションでいつでもすべての疑似レジスタが使用できるわけではありません。
レジスタの表示
OutputRegisters および OutputRegisters2 メソッドは、ターゲットのレジスタをフォーマットし、出力としてクライアントに送信します。
イベント
ターゲットのレジスタの値が変更されるたびに、エンジンはパラメータ Flags を DEBUG_CDS_REGISTERS に設定して IDebugEventCallbacks::ChangeDebuggeeState コールバック メソッドを呼び出します。