共通の式エバリュエーター機能
ここでは、言語は違ってもデバッガーに共通する多彩な式エバリュエーター機能について説明します。
暗黙的な変数
Visual Basic と C# では、式エバリュエーターを使用して、暗黙的な変数を作成できます。この暗黙的な変数はスコープの外部に出ることはなく、任意の変数として扱うことができます。
C# では、式エバリュエーターで宣言すると暗黙的な変数を作成できます。たとえば、[イミディエイト] ウィンドウでは、次の C# コードを入力できます。
int b = 100;
[イミディエイト] ウィンドウのこのコードを実行すると、新しい暗黙的な変数が [ローカル] ウィンドウに表示されます。変数名の前には $ という記号が表示されます (この場合は、$b)。
Visual Basic では、式エバリュエーターで暗黙的な変数を宣言できません。しかし、Visual Basic の式エバリュエーターで宣言されていない変数を使用すると、暗黙的な変数が自動的に作成されます。Visual Basic では、暗黙的な変数は [ローカル] ウィンドウに表示されません。
ブレークポイント
[イミディエイト] ウィンドウを使用して、ブレークポイントを含む Visual Basic または C# のメソッドまたは関数を評価する場合、そのブレークポイントはヒットし、新しいフレームが [呼び出し履歴] に表示されます。次に C# のコード例を示します。
class Program
{
static void Main(string[] args)
{
// Breakpoint here:
int a = 20;
}
}
コメントが示す位置にブレークポイントを設定し、F5 キーを押してプログラムをコンパイルし実行すると、通常の方法でブレークポイントにヒットします。[イミディエイト] ウィンドウに「Program.Main(null)」と入力して Main メソッドを評価する場合、ブレークポイントは 2 回ヒットし、[呼び出し履歴] でメソッドのエントリになります。
[ウォッチ] ウィンドウでの評価
意図しない副作用を防ぐために、関数とメソッドの呼び出しがデバッガーのステップごとに自動的に評価されることはありません。その代わり、アイコンを操作すると結果を手動で更新できます。結果が [値] 列に表示されます。したがって、呼び出しを手動で評価することが可能になります。詳細については、「副作用と式」を参照してください。
オブジェクト ID
この機能は、Visual Basic には使用できません。
アプリケーションによっては、クラスのインスタンスが数多く作成されます。このようなとき、クラスの特定のインスタンスを区別できるように ID を指定する方法が多くの場合有効です。たとえば、クラスの特定のインスタンスが期待どおりに動作していない場合、または特定のインスタンスが 1 しか含まれないはずのところに複数挿入されている場合などに役に立ちます。
ネイティブのオブジェクト ID
アンマネージ コードをデバッグする場合、アドレスを使用してオブジェクトを識別できます。これは、次の 2 つの理由から重要です。
アドレスを使用するだけでオブジェクトを追跡できる。これには、アドレスを使用する次の機能が含まれます。
そのアドレスでオブジェクトの値を表示。
等価性のチェック。多くの場合、オブジェクトのアドレスは、オブジェクト変数自体と同じ方法で使用できます。
オブジェクト (インスタンス) のアドレスを使用して、そのインスタンスのメソッドにブレークポイントを設定できる。
たとえば、CMyType クラスのインスタンスであるオブジェクトがあり、アドレスは 0xcccccccc とします。次のように、そのインスタンスの aMethod メソッドに関数のブレークポイントを指定できます。
((CMyType *) 0xcccccccc)->aMethod
マネージ オブジェクト ID
マネージ コードでは、オブジェクトのアドレスを使用して識別する方法は使用できません。代わりに、共通言語ランタイム (CLR) のデバッグ サービスで生成され、オブジェクトに割り当てられた、オブジェクト ID という整数値を使用します。この数値は、CLR のデバッグ サービスで生成された正の整数です。オブジェクト ID 値には、オブジェクトを識別するという以外、重要な役割はありません。
オブジェクト ハンドルは、可変長の 10 進の整数で表示され、その後にシャープ記号 (#) が付きます。先頭にゼロは付きません。たとえば、5# です。ハンドルは、異なるデバッガー データのウィンドウの [値] 列に表示されます。
変数のオブジェクト ID を作成するには、変数を右クリックし、[オブジェクト ID の作成] をクリックします。デバッガーに、123# のように、シャープ記号 (#) が後ろに付いた数字が表示されます。オブジェクト ID を削除するには、変数を右クリックし、[オブジェクト ID の削除] をクリックします。
ブレークポイントにヒットすると、変数のハンドルを [ウォッチ] ウィンドウに入力できます。オブジェクト ID の値が表示され、他の変数と同様に、展開したり、調べたりできます。
オブジェクト ID を使用して、特定のインスタンスのメソッドにブレークポイントを設定できます。たとえば、CMyType クラスのインスタンスであるオブジェクトがあり、インスタンスのオブジェクト ID が 5# だとします。CMyType クラスには、aMethod メソッドが含まれます。次のように、そのインスタンス 5# の aMethod メソッドに関数のブレークポイントを設定できます。
((CMyType) 5#).aMethod
オブジェクト ID はブレークポイント条件にも使用できます。オブジェクト ID を条件でテストする方法の例を示します。
this == 5#
ブレークポイント条件を指定する方法については、「方法 : ブレークポイント条件を指定する」を参照してください。