次の方法で共有


スコープとシンボルのグループ

シンボル グループには、グループとして効率的に操作するための一連のシンボルが含まれています。 シンボル グループは手動で作成および設定することも、ローカル変数や関数の引数などの字句スコープ内のシンボルに基づいて自動的に生成および更新することもできます。 インターフェイス IDebugSymbolGroup は、シンボル グループを表すために使用されます。

シンボル グループを作成するには 2 つの方法があります。 空のシンボル グループは CreateSymbolGroup によって返され、現在の字句スコープのシンボル グループは GetScopeSymbolGroup によって返されます。

現在のスコープから生成されたシンボル グループは、ローカル変数のスナップショットです。 ターゲット内で何らかの実行が発生すると、シンボルが正確でなくなる可能性があります。 また、現在のスコープが変更されると、シンボル グループは現在のスコープを表しなくなります (シンボル グループが作成されたスコープを引き続き表すため)。

シンボルは、AddSymbol を使用してシンボル グループに追加でき、RemoveSymbolByIndex または RemoveSymbolByName を使用して削除できます。 OutputAsType メソッドは、シンボルのデータを処理するときに別のシンボル タイプを使用するようにデバッガーに指示します。

スコープ付きシンボルの値は正確ではない可能性があります。 特に、マシン アーキテクチャとコンパイラの最適化により、デバッガがシンボルの値を正確に判断できない場合があります。

シンボル エントリ情報は、シンボルの場所や種類などの説明です。 モジュール内のシンボルに関するこの情報を検索するには、IDebugSymbols::GetSymbolEntryInformation を使用します。 シンボル グループ内のシンボルに関するこの情報を検索するには、IDebugSymbolGroup::GetSymbolEntryInformation を使用します。 シンボルエントリ情報の詳細については、「DEBUG_SYMBOL_ENTRY」を参照してください。

次のメソッドは、シンボル グループ内のシンボルに関する情報を返します。

  • GetSymbolName はシンボルの名前を返します。

  • GetSymbolOffset は、シンボルに絶対アドレスがある場合、シンボルのターゲットの仮想アドレス空間内の絶対アドレスを返します。

  • GetSymbolRegister は、シンボルがレジスタに含まれている場合、シンボルを含むレジスタを返します。

  • GetSymbolSize は、シンボルのデータのサイズを返します。

  • GetSymbolTypeName は、シンボルのタイプの名前を返します。

  • GetSymbolValueText は、シンボルの値を文字列として返します。

シンボルがレジスターまたはデバッガー エンジンに認識されているメモリ位置に格納されている場合、その値は WriteSymbol を使用して変更できます。

シンボルに他のシンボルが含まれている場合、そのシンボルは親シンボルです。 たとえば、構造体にはそのメンバーが含まれます。 シンボルが別のシンボルに含まれている場合、そのシンボルは子シンボルになります。 シンボルは親シンボルでも子シンボルでもありえます。 各シンボル グループはフラットな構造を持ち、親シンボルとその子が含まれます。 各シンボルには深さがあります。シンボル グループ内に親のないシンボルの深さは 0 で、各子シンボルの深さは親の深さより 1 大きくなります。 親シンボルの子は、シンボル グループに存在する場合と存在しない場合があります。 シンボル グループに子が存在する場合、親シンボルは展開されたシンボルと呼ばれます。 シンボル グループ内のシンボルの子を追加または削除するには、ExpandSymbol を使用します。

シンボル グループ内のシンボルの数は、GetNumberSymbols によって返されます。 シンボル グループ内のシンボルのインデックスは識別番号です。 インデックスの範囲は、0 からシンボル数から 1 を引いた数までです。 シンボルをシンボル グループに追加またはシンボル グループから削除するたびに (シンボルを展開するなど)、シンボル グループ内のすべてのシンボルのインデックスが変更される場合があります。

親子関係に関する情報を含むシンボル パラメーターは、GetSymbolParameters を使用して見つけることができます。 このメソッドは DEBUG_SYMBOL_PARAMETERS 構造体を返します。

シンボル グループ内のシンボルは、OutputSymbols メソッドを使用してデバッガの出力ストリームに出力できます。

スコープ

現在のスコープ、または現在のローカル コンテキストによって、デバッガー エンジンによって公開されるローカル変数が決まります。 スコープには 3 つのコンポーネントがあります。

  1. スタック フレーム。

  2. 現在の指示。

  3. レジスタコンテキスト。

スタック フレームが呼び出しスタックの最上位にある場合、現在の命令は最後のイベントを引き起こした命令です。 それ以外の場合、現在の命令は、次に高いスタック フレームを生成した関数呼び出しになります。

GetScope メソッドと SetScope メソッドを使用して、現在のスコープを取得および設定できます。 イベントが発生すると、現在のスコープがイベントのスコープに設定されます。 ResetScope を使用すると、現在のスコープを最後のイベントのスコープにリセットできます。

スレッドコンテキスト

スレッド コンテキストは、スレッドを切り替えるときに Windows によって保存される状態です。 これは、レジスタ コンテキストには似ていますが、スレッド コンテキストではなく、レジスタ コンテキストの一部であるカーネル専用のプロセッサ状態が存在する点が異なります。 この追加の状態は、カーネル モードのデバッグ中にレジスタとして利用できます。

スレッド コンテキストは、ntddk.h で定義された CONTEXT 構造体によって表されます。 この構造はプラットフォームに依存し、その解釈は有効なプロセッサのタイプによって異なります。 GetThreadContext メソッドと SetThreadContext メソッドを使用して、スレッド コンテキストを取得および設定できます。