ブレークポイントの使用

 

Visual Studio 2017 RC の最新のドキュメントの詳細については、Visual Studio 2017 RC ドキュメントをご参照ください。

コードの変数の状態や呼び出し履歴の確認などのために、デバッガーの実行を停止するときにブレークポイントを設定できます。 ブレークポイントは、開発者が利用できる重要なデバッグ手法の 1 つです。

ソース コードに関数のブレークポイントを設定するには、ソース コード ファイルの左側の余白をクリックするか、コード行をポイントし、F9 キーを押します。 ブレークポイントの印として左側の余白に赤い点が表示され、コードの行にも色が設定されます。

ブレークポイントの設定

デバッガーでこのコードを実行してブレークポイントに達すると、ブレークポイントの行のコードが実行される前に、実行は停止されます。 ソース コードの行は黄色で表示されます。

実行が停止されているブレークポイント

この時点で、testInt の値は 1 のままです。

変数の値や呼び出し履歴など、アプリケーションの現在の状態を確認できます。 呼び出し履歴の詳細については、「方法 : [呼び出し履歴] ウィンドウを使用する」を参照してください。

ブレークポイントは、実行可能ファイルの任意のコード行に設定できます。 たとえば、上記の C# コードでは、変数の宣言、for ループ、または for ループ内の任意のコードにブレークポイントを設定できますが、名前空間またはクラスの宣言、またはメソッドのシグネチャにはブレークポイントを設定できません。

データの条件またはメモリ アドレスによっては、呼び出し履歴、[逆アセンブリ] ウィンドウ、およびネイティブ C++ コードにもブレークポイントを設定できます。

[呼び出し履歴] ウィンドウでブレークポイントを設定することで、呼び出し元の関数が返す命令または行で実行を中断できます。 呼び出し履歴の詳細については、「方法 : [呼び出し履歴] ウィンドウを使用する」を参照してください。 デバッガーの実行は停止している必要があります。

  1. アプリケーションのデバッグを開始し、(ブレークポイントの位置などで) 実行が停止するまで待ちます。[呼び出し履歴] ウィンドウを開きます ([デバッグ] / [ウィンドウ] / [呼び出し履歴] または CTRL + ALT + C キー)。

  2. 呼び出し元の関数を右クリックし、[ブレークポイント] / [ブレークポイントの挿入] を選択するか、F9 キーを押します。

  3. 関数呼び出し名の左側の余白にブレークポイント シンボルが表示されます。

[ブレークポイント] ウィンドウには、関数内の次に実行可能な命令に対応するメモリ位置に設定されたアドレスとして、呼び出し履歴のブレークポイントが表示されます。 デバッガーはその命令で実行を中断します。

コードの実行中にブレークポイントを視覚的にトレースするには、「デバッグを行うときの呼び出し履歴に対するメソッドのマップ」を参照してください。

アセンブリ命令にブレークポイントを設定するには、デバッガーが中断モードになっている必要があります。

  1. アプリケーションのデバッグを開始し、(ブレークポイントの位置などで) 実行が停止するまで待ちます。[逆アセンブリ] ウィンドウを開きます ([デバッグ] / [ウィンドウ] / [逆アセンブリ] または Ctrl + Alt + D キー)。

  2. 中断する命令の左側の余白をクリックするか、命令をポイントして F9 キーを押します。

データ ブレークポイントを使用すると、指定したメモリ位置に格納された値が変更されたときに、実行が中断されます。 値が読み取られても変更されていなければ、実行は中断されません。 データ ブレークポイントを設定するには、デバッガーが中断モードになっている必要があります。

  1. アプリケーションのデバッグを開始し、ブレークポイントに到達するまで待ちます。[デバッグ] メニューの [ブレークポイントの作成] / [データ ブレークポイント] を選択します (または、[ブレークポイント] ウィンドウを開き、[新規作成] / [データ ブレークポイント] を選択します)。

  2. [アドレス] ボックスに、メモリ アドレス、またはメモリ アドレスを表す式を入力します。 たとえば、「&avar」と入力すると、変数 avar の値が変更されたときに中断します。

  3. [バイト数] ドロップダウンで、デバッガーがウォッチするバイト数を選択します。 たとえば、[4] を選択すると、&avar で始まる 4 バイトがウォッチされ、そのバイト値のいずれかが変更されると中断します。

データ ブレークポイントは、特定のメモリ アドレスの適用範囲に依存している点に注意してください。

  • 変数のアドレスは、デバッグ セッションごとに変わります。 データ ブレークポイントは、デバッグ セッションが終了すると自動的に無効になります。

  • ローカル変数にデータ ブレークポイントを設定すると、関数が終了してもブレークポイントは有効なままですが、メモリ アドレスは変更されるので、ブレークポイントは予測どおりに機能しなくなります。 データ ブレークポイントをローカル変数に設定した場合は、関数が終了する前にブレークポイントを削除するか無効にすることをお勧めします。

データ ブレークポイントは次の条件では機能しません。

  • デバッグ対象外のプロセスがメモリ位置に書き込む場合

  • メモリ位置が複数のプロセス間で共有されている場合

  • メモリ位置がカーネル内で更新される場合 たとえば、32 ビット Windows の ReadFile 関数にメモリが渡された場合、メモリはカーネル モードから更新されるので、メモリの書き込み時にもデバッガーは中断されません。

オブジェクトのアドレスを使用して、クラスの特定のインスタンスで呼び出したメソッドにブレークポイントを設定することもできます。 次に例を示します。

たとえば、アドレスを使用して型 my_class のオブジェクトを指定する場合、そのインスタンスから呼び出される my_method という名前のメソッドに関数のブレークポイントを設定できます。

  1. クラスのそのインスタンスがインスタンス化された後のどこかにブレークポイントを設定します。

  2. インスタンスのアドレスを見つけます (ここでは 0xcccccccc)。

  3. [デバッグ] / [ブレークポイントの作成] / [関数のブレークポイント] をクリックします (または ALT + F9、B キー)。

  4. 次のテキストを [関数名] ボックスに追加します。

    ((my_class *) 0xcccccccc)->my_method  
    
    

[ブレークポイント] ウィンドウ ([デバッグ] / [ウィンドウ] / [ブレークポイント] または CTRL + ALT + B キー) では、ソリューションに設定したすべてのブレークポイントを確認できます。

[ブレークポイント] ウィンドウ

[ブレークポイント] ウィンドウでは、すべてのブレークポイントを一元的に管理できるます。ブレークポイントが重要な大規模なソリューションや複雑なデバッグ シナリオで、このウィンドウは特に役立ちます。 一連のブレークポイントの状態と位置を保存または共有する必要がある場合、[ブレークポイント] ウィンドウからのみ、ブレークポイントをエクスポートおよびインポートできます。

条件を設定して、ブレークポイントを実行するタイミングと場所を制御することができます。

  1. ブレークポイントを右クリックするか、ブレークポイントをポイントして設定アイコンをクリックします。

  2. コンテキスト メニューで [条件] を選択します。[ブレークポイント設定] ウィンドウが開きます。

ブレークポイント設定

[条件] ボックスをオンにすると、ウィンドウが展開され、さまざまな種類の条件が表示されます。

条件式: [条件式] を選択すると、[true の場合][変更された場合] という 2 つの条件を選択できます。 式の条件を満たす場合に中断するときは [true の場合] をオンにし、式の値が変更されたときに中断するときは [変更された場合] をオンにします。

次の例では、testInt の値が 4 の場合にのみ、ブレークポイントがヒットするように設定します。

[ブレークポイントの条件] が true

次の例では、testInt の値が変更された場合にのみ、ブレークポイントがヒットするように設定します。

変更時のブレークポイント

[変更された場合] フィールドの動作は、プログラミング言語によって異なります。 ネイティブ コードに対して [変更された場合] をオンにしている場合、デバッガーは条件の最初の評価を変更と見なさないため、最初の評価でブレークポイントはヒットしません。 マネージ コードに対して [変更された場合] をオンにしている場合、[変更された場合] が選択された後の最初の評価でブレークポイントがヒットします。

無効な構文でブレークポイント条件を設定すると、警告メッセージが表示されます。 有効な構文でブレークポイント条件を指定しても、セマンティクスが無効な場合は、ブレークポイントに初めて達したときに警告メッセージが表示されます。 どちらの場合でも、無効なブレークポイントに達すると実行が中断されます。 ブレークポイント条件が有効で、評価結果が false の場合にのみ、ブレークポイントはスキップされます。

条件には、デバッガーによって認識される有効な式を指定できます。 有効な式の詳細については、「デバッガー内の式」を参照してください。

特定のオブジェクトの動作を確認することが必要になる場合があります。たとえば、オブジェクトがコレクションに複数回挿入された理由を確認することが必要になる場合があります。 C# と F# では、参照型の特定のインスタンスのオブジェクト ID を作成し、それらの ID をブレークポイントの条件で使用できます。 オブジェクト ID は、共通言語ランタイム (CLR) のデバッグ サービスで生成されて、オブジェクトに関連付けられます。 オブジェクト ID を作成するには、次の手順を実行します。

  1. コードで、オブジェクトが作成されてからしばらく経った時点にブレークポイントを設定します。

  2. デバッグを開始し、ブレークポイントで実行が停止したら、[ローカル] ウィンドウで対象のブレークポイントを見つけて右クリックし、[オブジェクト ID の作成] を選択します。

    [ローカル] ウィンドウに、$ が付いた番号が表示されるはずです。 これが、オブジェクト ID です。

  3. オブジェクトがコレクションに追加されるときなど、調査が必要となるポイントに、新しい条件付きブレークポイントを追加します。

  4. [条件式] フィールドでは、オブジェクト ID を使用します。 たとえば、コレクションに追加するオブジェクトを参照する変数 item が存在する場合、「item == $n」と入力します。ここで、n はオブジェクト ID 番号です。

    そのオブジェクトがコレクションに追加されると、実行が停止します。

後でオブジェクト ID を削除する場合は、[ローカル] ウィンドウで変数を右クリックして、[オブジェクト ID の削除] を選択します。

オブジェクト ID によって作成される参照は弱い参照であり、これにより、オブジェクトがガベージ コレクションの対象から除外されることはないことに注意してください。 オブジェクト ID は、現在のデバッグ セッションでのみ有効です。

コード内のループがある回数の反復の後に誤動作を開始することが疑われる場合、関連するコード行に対して指定したヒット カウントを超えると実行を停止するブレークポイントを設定できます。これにより、目的の反復回数に達するまで何度も F5 キーを押す必要がなくなります。

[ブレークポイントの設定] ウィンドウで、[ヒット カウント] に条件を設定します。 次に、イテレーション回数を指定できます。 次の例では、イテレーションごとにヒットするようにブレークポイントを設定します。

ブレークポイントのヒット カウント

指定されたデバイスでのみ、または指定されたプロセスとスレッドでのみ、ブレークポイントが発生するように制限できます。

[ブレークポイントの設定] ウィンドウで、[フィルター] に条件を設定します。 次の式のうち 1 つ以上を入力します。

  • MachineName = "name"

  • ProcessId = value

  • ProcessName = "name"

  • ThreadId = value

  • ThreadName = "name"

文字列の値を二重引用符で囲みます。 句は、& (AND)、|| (OR)、! (NOT)、およびかっこを使用して結合できます。

トレースポイントは、[出力] ウィンドウにメッセージを出力するブレークポイントです。 トレースポイントはプログラミング言語の一時的なトレース ステートメントのように機能できます。

[ブレークポイントの設定] ウィンドウで、[アクション] ボックスをオンにします。[アクション] グループの [出力ウィンドウにメッセージを記録する] を選択します。"これはテストです" など、汎用文字列を出力することができます。 変数または式の値を含めるには、中かっこで囲みます。

トレースポイントがヒットしときに実行を中断するには、[続けて実行する] チェック ボックスをオフにします。[続けて実行する] をオンにすると、実行は停止しません。 どちらの場合も、メッセージが出力されます。

次の特別なキーワードを [メッセージ] に使用できます。

$ADDRESS現在の命令
$CALLER関数名の呼び出し
$CALLSTACK呼び出し履歴
$FUNCTION現在の関数名
$PIDプロセス ID
$PNAMEプロセス名
$TIDスレッド ID
$TNAMEスレッド名
$TICK
$TNAME

ブレークポイントのラベルは、[ブレークポイント] ウィンドウでブレークポイントの一覧の並べ替えとフィルターにのみ使用します。 ブレークポイントにラベルを追加するには、ブレークポイントの行を選択し、コンテキスト メニューの [ラベル] をクリックします。

XML ファイルにブレークポイントをエクスポートするには、ブレークポイントを右クリックし、[エクスポート] を選択します。 既定で、ファイルはソリューション ディレクティブに保存されます。 ブレークポイントをインポートするには、[ブレークポイント] ウィンドウを開き (CTRL + ALT + B キー)、ツールバーの右向き矢印をクリックします (ツールヒントは [ファイルからブレークポイントをインポートします] です)。

ブレークポイントを削除したが、デバッグを再実行するとヒットし続ける

デバッグ中にブレークポイントを削除しても、場合によっては次にデバッグを開始したときにブレークポイントがヒットすることがあります。 このブレークポイントのヒットを停止するには、ブレークポイントのすべてのインスタンスが [ブレークポイント] ウィンドウから削除されていることを確認します。

デバッガーがブレークポイントのソース ファイルの正しいバージョンを特定できない

ソース ファイルが変更されて、デバッグ対象のコードと一致しなくなった場合、デバッガーは、ソース ファイルが存在していても、ブレークポイントに対応するソース ファイルを探すことがあります。

  1. Visual Studio で、デバッグ対象のバージョンと一致しないソース コードを表示するには、[デバッグ] / [オプションと設定] を選択します。[デバッグ] / [全般] ページで、[元のバージョンと完全に一致するソース ファイルを必要とする] オプションをオフにします。

  2. ブレークポイントをソース ファイルにバインドすることもできます。 ブレークポイントを選択し、コンテキスト メニューの [条件] をクリックします。[ブレークポイントの設定] ウィンドウで [元のバージョンと異なるソース コードを許可する] チェック ボックスをオンにします。

ブレークポイントが DLL で機能しない

デバッガーがモジュールのコードの場所に関するデバッグ情報を読み込んでいない場合は、ソース ファイルにブレークポイントを設定できません。 このようなときは、ブレークポイントを設定できないことを示すメッセージが表示されます。 ブレークポイントの場所に、警告ブレークポイント グリフが表示されます。 ただし、これらの警告ブレークポイントは、コードが読み込まれたときに実際のブレークポイントになります。 シンボルの読み込みの詳細については、「シンボルとソース コードの管理」を参照してください。

デバッガーでのコード間の移動

表示: