次の方法で共有


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

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

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

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

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

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

シンボルエントリ情報は、シンボルの場所とその種類を含むシンボルの説明です。 モジュール内のシンボルに関するこの情報を見つけるには、 IDebugSymbols3::GetSymbolEntryInformation を使用します。 シンボル グループ内のシンボルに関するこの情報を検索するには、 IDebugSymbolGroup2::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 メソッドを使用して、スレッド コンテキストを取得および設定できます。