Visual Studioデバッガーでのブレークポイントの使用

  • 06/30/2020
  • 12 読むべき分
    • M
    • g
    • j
    • v
    • g
    • +8

ブレークポイントは、開発者のツールボックスで最も重要なデバッグ手法の1つです。 デバッガーの実行を一時停止する場所には、ブレークポイントを設定します。 たとえば、コード変数の状態を確認したり、特定のブレークポイントでコールスタックを確認したりすることができます。 ブレークポイントの使用中に警告や問題を解決しようとする場合は、”Visual Studioデバッガーのブレークポイントのトラブルシューティング”を参照してください。

注意

解決しようとしているタスクや問題はわかっているが、どのようなブレークポイントを使用するかを知る必要がある場合は、FAQ-デバッグ機能を

ソースコードにブレークポイントを設定

実行可能コードの任意の行にブレークポイントを設定できます。 たとえば、次のC#コードでは、変数割り当て(int testInt = 1)、forループ、またはforループ内の任意のコードを使用して、コード行にブレークポイントを設定できます。 メソッドシグネチャ、名前空間またはクラスの宣言、または代入がなくgetter/setterがない場合は変数宣言にブレークポイントを設定することはできません。

ソースコードにブレークポイントを設定するには、コード行の横にある左端のマージンをクリックします。 また、行を選択してf9を押すか、Debug>Toggle Breakpointを選択するか、右クリックしてBreakpoint>Insert breakpointを選択することもできます。 ブレークポイントは、左マージンに赤い点として表示されます。

C#を含むほとんどの言語では、ブレークポイントと現在の実行行が自動的に強調表示されます。 C++コードでは、ツール(またはデバッグ)>オプション>デバッグ>ブレークポイントと現在のステートメントのソース行全体を強調表示する(C++のみ)を選択することで、ブレークポイントと現在の行の強調表示をオンにすることができます。

ブレークポイントを設定する

デバッグすると、その行のコードが実行される前にブレークポイントで実行が一時停止します。 ブレークポイント記号には黄色の矢印が表示されます。

次の例のブレークポイントでは、testIntの値は1のままです。 したがって、黄色の文はまだ実行されていないため、変数が初期化されてから値は変更されていません(値1に設定されています)。

ブレークポイントの実行が停止しました

デバッガーがブレークポイントで停止すると、変数値や呼び出し履歴など、アプリの現在の状態を確認できます。

ブレークポイントを操作するための一般的な手順をいくつか示します。

  • ブレークポイントはトグルです。 これをクリックするか、f9キーを押すか、Debug>Toggle Breakpointを使用して削除または再挿入できます。

  • ブレークポイントを削除せずに無効にするには、その上にカーソルを置くか右クリックして、[ブレークポイントを無効にする]を選択します。 無効なブレークポイントは、左余白またはブレークポイントウィンドウに空のドットとして表示されます。 ブレークポイントを再度有効にするには、ブレークポイントの上にカーソルを置くか右クリックして、”ブレークポイントを有効にする”を選択します。

  • ブレークポイントを右クリックして適切なコマンドを選択するか、その上にマウスを置いて設定アイコンを選択して、条件とアクションの設定、ラベルの追加と編集、またはブレークポイントのエクスポートを行います。

ブレークポイントアクションとトレースポイント

トレースポイントは、出力ウィンドウにメッセージを出力するブレークポイントです。 トレースポイントは、プログラミング言語の一時的なトレースステートメントのように機能し、コードの実行を一時停止しません。 トレースポイントを作成するには、ブレークポイント設定ウィンドウで特別なアクションを設定します。 詳細な手順については、”Visual Studioデバッガーでトレースポイントを使用する”を参照してください。

ブレークポイント条件

条件を設定することで、ブレークポイントがいつどこで実行されるかを制御できます。 条件は、デバッガーが認識する任意の有効な式にすることができます。 有効な式の詳細については、”デバッガーでの式”を参照してください。

ブレークポイント条件を設定するには:

  1. ブレークポイント記号を右クリックし、条件を選択します(またはAlt+F9,Cキーを押します)。 または、ブレークポイントシンボルの上にカーソルを置き、設定アイコンを選択し、ブレークポイント設定ウィンドウで条件を選択します。

    ブレークポイントウィンドウでは、ブレークポイントを右クリックして設定を選択し、条件を選択することで条件を設定することもできます。

    ブレークポイント設定

  2. ドロップダウンで、条件式、ヒット数、またはフィルタを選択し、それに応じて値を設定します。

  3. “閉じる”を選択するか、Ctrl+Enterキーを押して”ブレークポイント設定”ウィンドウを閉じます。 または、”ブレークポイント”ウィンドウで”OK”を選択してダイアログを閉じます。

条件が設定されたブレークポイントは、ソースコードとブレークポイントウィンドウに+記号で表示されます。

条件式の作成

条件式を選択すると、trueまたは変更されたときの二つの条件のいずれかを選択できます。 Chooseは、式が満たされたときにbreakする場合はtrue、式の値が変更されたときにbreakする場合は変更されたときにtrueです。

次の例では、ブレークポイントはtestIntの値が4の場合にのみヒットします:

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

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

Breakpoint When changed

無効な構文でブレークポイント条件を設定すると、警告メッセージが表示されます。 有効な構文で無効なセマンティクスでブレークポイント条件を指定すると、ブレークポイントが最初にヒットしたときに警告メッセージが表示されま いずれの場合も、デバッガーが無効なブレークポイントに達すると、デバッガーが中断されます。 ブレークポイントは、条件が有効でfalseと評価される場合にのみスキップされます。

When changedフィールドでは、デバッガーは条件の最初の評価を変更とは見なさないため、最初の評価のブレークポイントには達しません。

条件式でオブジェクトIdを使用する(C#およびF#のみ)

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

オブジェクトIDを作成するには:

  1. オブジェクトが作成された後、コード内のブレークポイントをいくつかの場所に設定します。

  2. デバッグを開始し、ブレークポイントで実行が一時停止したら、Debug>Windows>Localsを選択します(またはCtrl+Alt+V,Lを押してLocalsウィンドウを開きます)。

    Localsウィンドウで特定のオブジェクトインスタンスを検索し、右クリックして[Make Object ID]を選択します。

    ローカルウィンドウに$と数字が表示されます。 これはオブジェクトIDです。

  3. オブジェクトをコレクションに追加する場合など、調査するポイントに新しいブレークポイントを追加します。 ブレークポイントを右クリックし、”条件”を選択します。

  4. [条件式]フィールドでオブジェクトIDを使用します。 たとえば、変数itemがコレクションに追加されるオブジェクトである場合、selectはtrueで、item==$<n>と入力します。<n>はオブジェクトID番号です。

    実行は、そのオブジェクトがコレクションに追加される時点で中断されます。

    オブジェクトIDを削除するには、Localsウィンドウで変数を右クリックし、Delete Object IDを選択します。

オブジェクトIdは弱参照を作成し、オブジェクトがガベージコレクションされるのを防ぐことはできません。 これらは、現在のデバッグセッションでのみ有効です。

ヒットカウント条件の設定

コード内のループが特定の反復回数の後に不正な動作を開始すると思われる場合は、その反復に到達するためにf5を繰り

ブレークポイント設定ウィンドウの条件で、ヒット数を選択し、反復回数を指定します。 次の例では、ブレークポイントは他のすべての反復でヒットするように設定されています:

ブレークポイントヒット数

フィルタ条件の設定

ブレークポイントを、指定したデバイス、または指定したプロセスとスレッドでのみ起動するよ

ブレークポイント設定ウィンドウの条件で、フィルターを選択し、次の式のいずれかまたは複数を入力します:

  • マシン名=”名前”
  • ProcessId=値
  • ProcessName=”名前”
  • ThreadId=値
  • ThreadName=”名前”

文字列値を二重引用符で囲みます。 句は、&(AND)、||(OR)、!(NOT)、および括弧を使用して組み合わせることができます。

関数ブレークポイントの設定

関数が呼び出されたときに実行を中断することができます。 これは、たとえば、関数名はわかっているが、その場所はわかっていない場合に便利です。 また、同じ名前の関数があり、それらすべてを分割したい場合にも便利です(オーバーロードされた関数や異なるプロジェクトの関数など)。

関数ブレークポイントを設定するには:

  1. Debug>New Breakpoint>Function Breakpointを選択するか、Ctrl+K,Bを押します。

    ブレークポイントウィンドウで新しい>関数ブレークポイントを選択することもできます。

  2. [新しい関数ブレークポイント]ダイアログで、[関数名]ボックスに関数名を入力します。

    関数の仕様を絞り込むには、次の手順を実行します。:

    • 完全修飾関数名を使用します。

      : Namespace1.ClassX.MethodA()

    • オーバーロードされた関数のパラメーター型を追加します。

      : MethodA(int, string)

    • “を使用してください!’モジュールを指定する記号。

      : App1.dll!MethodA

    • ネイティブC++でコンテキスト演算子を使用します。

      {function, , }

      例: {MethodA, , App1.dll}+2

  3. [言語]ドロップダウンで、関数の言語を選択します。

  4. [OK]を選択します。

メモリアドレスを使用した関数ブレークポイントの設定(ネイティブC++のみ)

オブジェクトのアドレスを使用して、クラスの特定のインスタンスによ たとえば、my_class型のアドレス指定可能なオブジェクトを指定すると、インスタンスが呼び出すmy_methodメソッドに関数ブレークポイントを設定できます。

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

  2. インスタンスのアドレスを検索します(たとえば、0xcccccccc)。

  3. Debug>New Breakpoint>Function Breakpointを選択するか、Ctrl+K,Bを押します。

  4. [関数名]ボックスに以下を追加し、[C++言語]を選択します。

    ((my_class *) 0xcccccccc)->my_method

データブレークポイントの設定(.NET Core3.0以上)

データブレークポイント特定のオブジェクトのプロパティが変更されたときに実行が中断されます。

データブレークポイントを設定するには

  1. .NET Coreプロジェクトでは、デバッグを開始し、ブレークポイントに達するまで待ちます。

  2. Autos、Watch、またはLocalsウィンドウで、プロパティを右クリックし、コンテキストメニューで値が変更されたときに中断を選択します。

    マネージデータブレークポイント

NET Coreのデータブレークポイントは機能しません:

  • tooltip、Locals、Autos、またはWatchウィンドウで拡張できないプロパティ
  • 静的変数
  • DebuggerTypeProxy属性を持つクラス
  • 構造体内のフィールド

Set data breakpoints(ネイティブC++のみ)

Data breakpoints指定されたメモリアドレスに格納されている値が変更されると、実行が中断されます。 値が読み取られても変更されていない場合、実行は中断されません。

データブレークポイントを設定するには:

  1. C++プロジェクトでは、デバッグを開始し、ブレークポイントに達するまで待ちます。 デバッグメニューで、新規ブレークポイント>データブレークポイントを選択します。

    ブレークポイントウィンドウで新規>データブレークポイントを選択するか、Autos、Watch、Localsウィンドウで項目を右クリックし、コンテキストメニューで値が変更されたときにブレークを選択することもできます。

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

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

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

  • デバッグされていないプロセスは、メモリの場所に書き込みます。
  • メモリ位置は、複数のプロセス間で共有されています。
  • カーネル内のメモリ位置が更新されます。 たとえば、メモリが32ビットWindowsReadFile関数に渡された場合、メモリはカーネルモードから更新されるため、デバッガは更新時に中断されません。
  • ここで、ウォッチ式は32ビットハードウェアでは4バイト、64ビットハードウェアでは8バイトより大きい。 これはx86アーキテクチャの制限です。

メモ

  • データブレークポイントは、特定のメモリアドレスに依存します。 変数のアドレスはデバッグセッションごとに変更されるため、各デバッグセッションの最後にデータブレークポイントが自動的に無効になります。

  • ローカル変数にデータブレークポイントを設定した場合、ブレークポイントは関数の終了時に有効のままになりますが、メモリアドレスは適用できなくな ローカル変数にデータブレークポイントを設定した場合は、関数が終了する前にブレークポイントを削除するか無効にする必要があります。

ブレークポイントウィンドウでのブレークポイントの管理

ブレークポイントウィンドウを使用して、ソリューション内のすべてのブレークポイントを この一元化された場所は、大規模なソリューションや、ブレークポイントが重要な複雑なデバッグシナリオで特に役立ちます。

ブレークポイントウィンドウでは、ブレークポイントの検索、並べ替え、フィルタリング、有効/無効、または削除を行うことができます。 また、条件やアクションを設定したり、新しい関数やデータブレークポイントを追加したりすることもできます。

ブレークポイントウィンドウを開くには、Debug>Windows>Breakpointsを選択するか、Ctrl+Alt+Bを押します。

Breakpointsウィンドウ

ブレークポイントウィンドウに表示する列を選択するには、列の表示を選択します。 列ヘッダーを選択して、その列でブレークポイントの一覧を並べ替えます。

ブレークポイントラベル

ブレークポイントウィンドウでは、ラベルを使用してブレークポイントのリストをソートおよびフィルタリングできます。

  1. ブレークポイントにラベルを追加するには、ソースコードまたはブレークポイントウィンドウでブレークポイントを右クリックし、ラベルの編集を選択します。 新しいラベルを追加するか、既存のラベルを選択し、[OK]を選択します。
  2. ラベル、条件、またはその他の列ヘッダーを選択して、ブレークポイントウィンドウのブレークポイントリストを並べ替えます。 表示する列を選択するには、ツールバーの[列を表示]を選択します。

ブレークポイントのエクスポートとインポート

ブレークポイントの状態と場所を保存または共有するには、それらをエクスポートまたはインポートできます。

  • 単一のブレークポイントをXMLファイルにエクスポートするには、ソースコードまたはブレークポイントウィンドウでブレークポイントを右クリックし、エクスポー エクスポート先を選択し、[保存]を選択します。 既定の場所はソリューションフォルダーです。
  • 複数のブレークポイントをエクスポートするには、ブレークポイントウィンドウでブレークポイントの横にあるボックスを選択するか、検索フィールドに検 現在の検索条件に一致するすべてのブレークポイントをエクスポートするアイコンを選択し、ファイルを保存します。
  • すべてのブレークポイントをエクスポートするには、すべてのボックスの選択を解除し、検索フィールドを空白のままにします。 現在の検索条件に一致するすべてのブレークポイントをエクスポートするアイコンを選択し、ファイルを保存します。
  • ブレークポイントをインポートするには、”ブレークポイント”ウィンドウで、”ファイルからブレークポイントをインポート”アイコンを選択し、XMLファイルの場所に移動し、”開く”を選択します。

デバッガーウィンドウからのブレークポイントの設定

コールスタックおよび分解デバッガーウィンドウからブレークポイントを設定することもできます。

コールスタックウィンドウでブレークポイントを設定する

呼び出し元の関数が返す命令または行でブレークするには、コールスタックウィンドウでブレークポイントを設定することができます。

コールスタックウィンドウにブレークポイントを設定するには:

  1. コールスタックウィンドウを開くには、デバッグ中に一時停止する必要があります。 デバッグ>Windows>コールスタックを選択するか、Ctrl+Alt+Cを押します。

  2. コールスタックウィンドウで、呼び出し元の関数を右クリックし、ブレークポイント>ブレークポイントの挿入を選択するか、f9キーを押します。

    コールスタックの左マージンの関数呼び出し名の横にブレークポイント記号が表示されます。

コールスタックブレークポイントは、ブレークポイントウィンドウにアドレスとして表示され、関数内の次の実行可能命令に対応するメモリ位置が表示さ

デバッガは命令で中断します。

コールスタックの詳細については、”方法:コールスタックウィンドウを使用する”を参照してください。

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

分解ウィンドウでブレークポイントを設定する

  1. 逆アセンブルウィンドウを開くには、デバッグ中に一時停止する必要があります。 Debug>Windows>Disassemblyを選択するか、Ctrl+Alt+Dを押します。

  2. 逆アセンブルウィンドウで、中断する命令の左マージンをクリックします。 これを選択してf9キーを押すか、右クリックしてブレークポイント>ブレークポイントの挿入を選択することもできます。

関連項目

  • デバッグとは何ですか?
  • Visual Studioを使用してより良いC#コードを書く
  • 最初にデバッグを見て
  • Visual Studioデバッガーでブレークポイントのトラブルシューティング

コメントを残す

メールアドレスが公開されることはありません。