Visual Studio デバッガーでブレークポイントを使用する
ブレークポイントは、開発者が利用できる重要なデバッグ手法の 1 つです。 デバッガーの実行を一時停止したい任意の場所に、ブレークポイントを設定します。 たとえば、特定のブレークポイントで、コードの変数の状態を確認したり、呼び出し履歴を調べたりすることができます。 ブレークポイントを使用して警告または問題を解決しようとしている場合は、「Visual Studio デバッガーでのブレークポイントのトラブルシューティング」を参照してください。
Note
解決しようとしているタスクまたは問題はわかっていても、使用するブレークポイントの種類を知る必要がある場合は、FAQ - デバッグ機能の検索に関するページを参照してください。
ソース コードでブレークポイントを設定する
ブレークポイントは、実行可能ファイルの任意のコード行に設定できます。 たとえば、次の C# コードでは、変数代入 (int testInt = 1
)、for
ループ、または for
ループ内の任意のコードを使用して、コード行にブレークポイントを設定できます。 割り当てがなく、ゲッターとセッターもない場合は、メソッド シグネチャ、名前空間かクラスの宣言、または変数宣言にブレークポイントを設定することはできません。
ソース コードでブレークポイントを設定するには:
- コード行の左端の余白をクリックします。 行を選択して、F9 キーを押すか、[デバッグ]>[ブレークポイントの設定/解除] を選択するか、右クリックして [ブレークポイント]>[ブレークポイントの挿入] を選択することもできます。 左側の余白にブレークポイントが赤い点で表示されます。
C# を含むほとんどの言語では、ブレークポイントと現在の実行行が自動的に強調表示されます。 C++ コードの場合、[ツール] (または [デバッグ]) >[オプション]>[デバッグ]>[ブレークポイントおよび現在のステートメントのソース行全体を強調表示する (C++ のみ)] を選択することで、ブレークポイントと現在行の強調表示をオンにできます。
デバッグ時には、ブレークポイントで、その行のコードが実行される前に、実行が一時停止されます。 ブレークポイントの記号に黄色い矢印が表示されます。
次の例のブレークポイントでは、testInt
の値はまだ 3 です。 つまり、黄色のステートメントはまだ実行されていないため、変数の値は初期化された状態 (値 3 に設定) から変わっていません。
次の例のブレークポイントでは、testInt
の値はまだ 1 です。 つまり、黄色のステートメントはまだ実行されていないため、変数の値は初期化された状態(値 1 に設定) から変わっていません。
デバッガーがブレークポイントで停止すると、変数の値や呼び出し履歴など、アプリの現在の状態を確認できます。
ここでは、ブレークポイントを操作するための一般的な手順について説明します。
ブレークポイントはトグルです。 ブレークポイントをクリックするか、F9 キーを押すか、[デバッグ]>[ブレークポイントの設定/解除] を使用して、削除または再挿入することができます。
ブレークポイントを削除せずに無効にするには、ブレークポイントをポイントするか右クリックして、[ブレークポイントを無効にする] を選択します。 左側の余白または [ブレークポイント] ウィンドウでは、無効なブレークポイントは中空のドットとして表示されます。 ブレークポイントを再び有効にするには、ブレークポイントをポイントするか右クリックして、[ブレークポイントを有効にする] を選択します。
条件とアクションの設定、ラベルの追加と編集、またはブレークポイントのエクスポートを行うには、右クリックして適切なコマンドを選択するか、ブレークポイントをポイントして [設定] アイコンを選択します。
ブレークポイントアクションとトレースポイント
トレースポイントは、[出力] ウィンドウにメッセージを出力するブレークポイントです。 トレースポイントはプログラミング言語の一時的なトレース ステートメントのように機能し、コードの実行が一時停止されることはありません。 トレースポイントを作成するには、[ブレークポイント設定] ウィンドウで特別なアクションを設定します。 詳細な手順については、Visual Studio デバッガーでのトレースポイントの使用に関するページを参照してください。
ブレークポイント条件
条件を設定して、ブレークポイントを実行するタイミングと場所を制御することができます。 条件には、デバッガーによって認識される有効な式を指定できます。 有効な式の詳細については、デバッガー内の式に関するページを参照してください。
ブレークポイント条件を設定するには:
ブレークポイントの記号を右クリックし、[条件] を選択します (または Alt + F9、C キーを押します)。 または、ブレークポイントの記号をポイントして [設定] アイコンを選択し、[ブレークポイント設定] ウィンドウで [条件] を選択します。
コード行の横にある左端の余白を右クリックし、コンテキスト メニューから [条件付きブレークポイントの挿入] を選んで、新しい条件付きブレークポイントを設定することもできます。
また、 [ブレークポイント] ウィンドウでブレークポイントを右クリックして [設定] を選び、 [条件] を選ぶことで、条件を設定することもできます
ドロップダウンで [条件式] 、 [ヒット カウント] 、または [フィルター] を選択し、それぞれに応じた値を設定します。
[閉じる] を選択するか、Ctrl + Enter キーを押して、[ブレークポイント設定] ウィンドウを閉じます。 または、[ブレークポイント] ウィンドウで、[OK] を選択してダイアログを閉じます。
ソース コードと [ブレークポイント] ウィンドウでは、条件が設定されているブレークポイントには + 記号が表示されます。
条件式を作成する
[条件式] を選択するときは、次の 2 つの条件のいずれかを選択できます: [true の場合] または [変更された場合]。 式の条件を満たす場合に中断するときは [true の場合] をオンにし、式の値が変更されたときに中断するときは [変更された場合] をオンにします。
次の例では、testInt
の値が 4 の場合にのみ、ブレークポイントがヒットするように設定します。
次の例では、testInt
の値が変更された場合にのみ、ブレークポイントはヒットします。
無効な構文でブレークポイント条件を設定すると、警告メッセージが表示されます。 有効な構文でブレークポイント条件を指定しても、セマンティクスが無効な場合は、ブレークポイントに初めて達したときに警告メッセージが表示されます。 どちらの場合でも、デバッガーは無効なブレークポイントにヒットすると中断されます。 ブレークポイント条件が有効で、評価結果が false
の場合にのみ、ブレークポイントはスキップされます。
Note
[変更された場合] フィールドの場合、デバッガーでは条件の最初の評価は変更とみなされないため、最初の評価ではブレークポイントにヒットしません。
条件式で オブジェクト ID を使用する (C#、F# のみ)
特定のオブジェクトの動作を観察しなければならないことがあります。 たとえば、オブジェクトがコレクションに複数回挿入された理由を確認するような場合です。 C# と F# では、参照型 の特定のインスタンスにオブジェクト ID を作成し、それらの ID をブレークポイントの条件で使用できます。 オブジェクト ID は、共通言語ランタイム (CLR) のデバッグ サービスで生成されて、オブジェクトに関連付けられます。
オブジェクト ID を作成するには:
コードで、オブジェクトが作成された後のどこかにブレークポイントを設定します。
デバッグを開始し、ブレークポイントで実行が停止したら、[デバッグ]>[ウィンドウ]>[ローカル] を選択して (または Ctrl + Alt + V、L キーを押して)、[ローカル] ウィンドウを開きます。
[ローカル] ウィンドウで特定のオブジェクト インスタンスを探し、右クリックして、[オブジェクト ID の作成] を選択します。
$ ウィンドウに、 [ローカル] ウィンドウを閉じます。 これが、オブジェクト ID です。
オブジェクトがコレクションに追加されるときなど、調査が必要となるポイントに、新しいブレークポイントを追加します。 ブレークポイントを右クリックし、[条件] を選択します。
[条件式] フィールドでは、オブジェクト ID を使用します。 たとえば、変数
item
がコレクションに追加するオブジェクトである場合、[true の場合] を選択し、「item == $<n>」と入力します。<n> はオブジェクト ID 番号です。そのオブジェクトがコレクションに追加されると、実行が停止します。
オブジェクト ID を削除する場合は、[ローカル] ウィンドウで変数を右クリックして、[オブジェクト ID の削除] を選択します。
Note
オブジェクト ID による参照は弱参照であり、これによって、オブジェクトがガベージ コレクションの対象から外れることはありません。 オブジェクト ID は、現在のデバッグ セッションでのみ有効です。
ヒット カウントの条件を設定する
コード内のループがある回数の反復の後に誤動作を開始することが疑われる場合、そのヒット カウントを超えると実行を停止するブレークポイントを設定できます。これにより、目的の反復回数に達するまで何度も F5 キーを押す必要がなくなります。
[ブレークポイント設定] ウィンドウの [条件] で [ヒット カウント] を選択し、反復回数を指定します。 次の例では、反復ごとにヒットするようにブレークポイントを設定します。
フィルター条件を設定する
指定されたデバイスでのみ、または指定されたプロセスとスレッドでのみ、ブレークポイントが発生するように制限できます。
[ブレークポイント設定] ウィンドウの [条件] で [フィルター] を選択し、次の式の 1 つまたは複数を入力します。
- MachineName = "name"
- ProcessId = value
- ProcessName = "name"
- ThreadId = value
- ThreadName = "name"
文字列の値を二重引用符で囲みます。 句は、 &
(AND)、 ||
(OR)、 !
(NOT)、およびかっこを使用して結合できます。
関数のブレークポイントを設定する
関数が呼び出されたときに実行を中断できます。 これは、たとえば関数名はわかっていても、その場所がわからない場合などに便利です。 また、同じ名前の関数が複数あり、それらすべてで中断したい場合にも便利です (オーバーロードされた関数や、異なるプロジェクトの関数など)。
関数のブレークポイントを設定するには:
[デバッグ]>[新しいブレークポイント]>[関数のブレークポイント] を選択するか、Ctrl + K、B. キーを押します。
また、[ブレークポイント] ウィンドウで [新規]>[関数のブレークポイント] を選択してもかまいません。
[新しい関数のブレークポイント] ダイアログで、[関数名] ボックスに関数の名前を入力します。
関数の指定を絞り込むには、次のようにします。
完全修飾関数名を使用します。
例:
Namespace1.ClassX.MethodA()
オーバーロードされた関数のパラメーターの型を追加します。
例:
MethodA(int, string)
"!" 記号を使用して、モジュールを指定します。
例:
App1.dll!MethodA
ネイティブ C++ でコンテキスト演算子を使用します。
{function, , [module]} [+<line offset from start of method>]
例:
{MethodA, , App1.dll}+2
[言語] ドロップダウンで、関数の言語を選択します。
[OK] を選択します。
メモリ アドレスを使用して関数のブレークポイントを設定する (ネイティブ C++ のみ)
オブジェクトのアドレスを使用して、クラスの特定のインスタンスで呼び出されるメソッドに関数のブレークポイントを設定できます。 たとえば、my_class
型のアドレス指定可能なオブジェクトがある場合、そのインスタンスから呼び出される my_method
メソッドに関数のブレークポイントを設定できます。
クラスのそのインスタンスがインスタンス化された後のどこかにブレークポイントを設定します。
インスタンスのアドレスを見つけます (例:
0xcccccccc
)。[デバッグ]>[新しいブレークポイント]>[関数のブレークポイント] を選択するか、Ctrl + K、B. キーを押します。
以下を [関数名] ボックスに追加し、[C++] 言語を選択します。
((my_class *) 0xcccccccc)->my_method
データ ブレークポイントを設定する (.NET Core 3.x または .NET 5+)
データ ブレークポイントでは、特定のオブジェクトのプロパティが変更されたときに実行が中断されます。
データ ブレークポイントを設定するには:
.NET Core または .NET 5 以降のプロジェクトでデバッグを開始し、ブレークポイントに到達するまで待ちます。
[自動変数]、[ウォッチ]、または [ローカル] ウィンドウで、プロパティを右クリックし、コンテキスト メニューの [値が変更されたときに中断] を選択します。
.NET Core と .NET 5 以降のデータ ブレークポイントは、次の場合には機能しません。
- ツールヒント、[ローカル]、[自動変数]、または [ウォッチ] ウィンドウで展開できないプロパティ
- 静的変数
- DebuggerTypeProxy 属性を持つクラス
- 構造体内のフィールド
設定できる最大数については、データ ブレークポイントのハードウェア制限に関する記事を参照してください。
データ ブレークポイントを設定する (ネイティブ C++ のみ)
データ ブレークポイントを使用すると、指定したメモリ位置に格納された値が変更されたときに、実行が中断されます。 値が読み取られても変更されていなければ、実行は中断されません。
データ ブレークポイントを設定するには:
C++ プロジェクトでデバッグを開始し、ブレークポイントに達するまで待ちます。 [デバッグ] メニューの [新しいブレークポイント]>[データ ブレークポイント] を選択します。
または、[ブレークポイント] ウィンドウで [新規]>[データ ブレークポイント] を選択するか、[自動変数]、[ウォッチ]、または [ローカル] ウィンドウで項目を右クリックして、コンテキスト メニューの [値が変更されたときに中断] を選択することもできます。
[アドレス] ボックスに、メモリ アドレス、またはメモリ アドレスを表す式を入力します。 たとえば、「
&avar
」と入力すると、変数avar
の値が変更されたときに中断します。[バイト数] ドロップダウンで、デバッガーがウォッチするバイト数を選択します。 たとえば、 [4]を選択すると、
&avar
で始まる 4 バイトがウォッチされ、そのバイト値のいずれかが変更されると中断します。
データ ブレークポイントは次の条件では機能しません。
- デバッグ対象外のプロセスがメモリ位置に書き込む場合
- メモリ位置が 2 つ以上のプロセス間で共有されている場合
- メモリ位置がカーネル内で更新される場合 たとえば、32 ビット Windows の
ReadFile
関数にメモリが渡された場合、メモリはカーネル モードから更新されるので、更新時にもデバッガーは中断されません。 - ウォッチ式が 4 バイト (32 ビット ハードウェア) または 8 バイト (64 ビット ハードウェア) より大きい場合。 これは、x86 アーキテクチャの制限です。
Note
データ ブレークポイントは、特定のメモリ アドレスに依存します。 変数のアドレスはデバッグ セッションが変わると変化するので、各デバッグ セッションの終了時に、データ ブレークポイントは自動的に無効になります。
ローカル変数にデータ ブレークポイントを設定すると、関数が終了してもブレークポイントは有効なままですが、メモリ アドレスは変更されるので、ブレークポイントは予測どおりに機能しなくなります。 データ ブレークポイントをローカル変数に設定した場合は、関数が終了する前にブレークポイントを削除するか無効にすることをお勧めします。
データ ブレークポイントのハードウェア制限
データ ブレークポイントを設定する場合、Windows カーネルと基になるハードウェアには次の制限があります。 制限とは、設定できるデータ ブレークポイントの最大数を指します。
プロセッサ アーキテクチャ | データ ブレークポイントの制限 |
---|---|
x64 および x86 | 4 |
ARM64 | 2 |
ARM | 1 |
依存ブレークポイントを設定する
依存ブレークポイントでは、別のブレークポイントが最初にヒットした場合にのみ実行が中断されます。 そのため、マルチスレッド アプリケーションをデバッグする場合などの複雑なシナリオでは、別のブレークポイントが最初にヒットした後に追加のブレークポイントを構成できます。 これにより、ゲーム ループやユーティリティ API などの共通パスにあるコードのデバッグがとても簡単になります。それらの関数内にあるブレークポイントを、その関数がアプリケーションの特定の部分から呼び出された場合にのみ有効化するように構成できるためです。
依存ブレークポイントを設定するには:
ブレークポイントの記号の上にマウス ポインターを移動し、[設定] アイコンを選んだ後、[ブレークポイントの設定] ウィンドウで [Only enable when the following breakpoint is hit]\(次のブレークポイントがヒットしたときにのみ有効化\) を選びます。
ドロップダウンから、現在のブレークポイントを依存させる前提条件のブレークポイントを選びます。
[閉じる] を選ぶか、Ctrl + Enter キーを押して、[ブレークポイント設定] ウィンドウを閉じます。 または、[ブレークポイント] ウィンドウから [OK] を選んで、ダイアログを閉じます。
また、右クリックのコンテキスト メニューを使って、依存ブレークポイントを設定することもできます。
コード行の横にある左端の余白を右クリックし、コンテキスト メニューから [条件付きブレークポイントの挿入] を選びます。
- アプリケーションにブレークポイントが 1 つしかない場合、依存ブレークポイントは機能しません。
- 前提条件のブレークポイントが削除されると、依存ブレークポイントは通常の行のブレークポイントに変換されます。
一時ブレークポイントを設定する
このブレークポイントを使うと、コードを 1 回だけ中断できます。 デバッグ時に、Visual Studio デバッガーによって実行中のアプリケーションがこのブレークポイントで 1 回だけ一時停止され、ヒットした直後にそれは削除されます。
一時ブレークポイントを設定するには:
ブレークポイントの記号の上にマウス ポインターを移動し、[設定] アイコンを選んだ後、[ブレークポイントの設定] ウィンドウで [Remove breakpoint once hit]\(ヒットしたらブレークポイントを削除する\) を選びます。
[閉じる] を選ぶか、Ctrl + Enter キーを押して、[ブレークポイント設定] ウィンドウを閉じます。 または、[ブレークポイント] ウィンドウから [OK] を選んで、ダイアログを閉じます。
また、右クリックのコンテキスト メニューを使って、一時ブレークポイントを設定することもできます。
コード行の横にある左端の余白を右クリックし、コンテキスト メニューから [Insert Temporary Breakpoint](一時ブレークポイントの挿入) を選びます。
または、単にショートカット F9 + Shift + Alt、T キーを使って、目的の行に一時ブレークポイントを設定できます。
[ブレークポイント] ウィンドウでブレークポイントを管理する
[ブレークポイント] ウィンドウを使用すると、ソリューション内のすべてのブレークポイントを表示および管理できます。 この一元化された場所は、大規模なソリューションや、ブレークポイントが重要である複雑なデバッグ シナリオに特に便利です。
[ブレークポイント] ウィンドウでは、ブレークポイントの検索、並べ替え、フィルター処理、有効化と無効化、削除を行うことができます。 また、条件とアクションを設定したり、新しい関数のブレークポイントまたはデータ ブレークポイントを追加したりすることもできます。
[ブレークポイント] ウィンドウを開くには、 [デバッグ]>[ウィンドウ]>[ブレークポイント] を選択するか、Ctrl+Alt+B キーを押します。
[ブレークポイント] ウィンドウに表示する列を選択するには、 [列の表示] を選択します。 列ヘッダーを選択すると、その列によってブレークポイントの一覧が並べ替えられます。
ブレークポイントのラベル
ラベルを使用すると、[ブレークポイント] ウィンドウのブレークポイントの一覧を並べ替えたり、フィルター処理したりできます。
- ブレークポイントにラベルを追加するには、ソース コードまたは [ブレークポイント] ウィンドウでブレークポイントを右クリックし、[ラベルの編集] を選択します。 新しいラベルを追加するか、既存のラベルを選択し、[OK] を選択します。
- [ブレークポイント] ウィンドウでブレークポイントの一覧を並べ替えるには、[ラベル]、[条件]、またはその他の列ヘッダーを選択します。 ツール バーの [列の表示] を選択して、表示する列を選択できます。
ブレークポイント グループ
複雑なデバッグ シナリオでは、ブレークポイント グループを作成してブレークポイントを整理することをおすすめします。 これにより、デバッグしようとしている現在のシナリオに基づいて、ブレークポイントの論理グループをすばやく有効または無効にすることができます。
[ブレークポイント] ウィンドウでブレークポイントを作成するには、[新規] > [ブレークポイント グループ] を選択してグループの名前を指定します。 グループにブレークポイントを追加するには、ブレークポイントを右クリックし、[ブレークポイント グループ ><グループ名> に追加] を選択します。 または、ブレークポイントを目的のグループにドラッグアンドドロップします。
デフォルトのブレークポイント グループを設定するには、グループを右クリックして [デフォルトのブレークポイント グループとして設定] を選択します。 デフォルトのブレークポイント グループを設定すると、新しく作成されたブレークポイントが自動的にグループに追加されます。
ブレークポイントをエクスポートおよびインポートする
ブレークポイントの状態と場所を保存または共有するには、ブレークポイントをエクスポートまたはインポートします。
- 1 つのブレークポイントを XML ファイルにエクスポートするには、ソース コードまたは [ブレークポイント] ウィンドウでブレークポイントを右クリックし、[エクスポート] または [選択した内容をエクスポート] を選択します。 エクスポートの場所を選択し、[保存] を選択します。 既定の場所は、ソリューション フォルダーです。
- 複数のブレークポイントをエクスポートするには、[ブレークポイント] ウィンドウで、ブレークポイントの横にあるボックスを選択するか、[検索] フィールドに検索条件を入力します。 [現在の検索条件に一致するすべてのブレークポイントをエクスポートします] アイコンをクリックして、ファイルを保存します。
- すべてのブレークポイントをエクスポートするには、すべてのボックスの選択を解除し、[検索] フィールドを空白のままにします。 [現在の検索条件に一致するすべてのブレークポイントをエクスポートします] アイコンをクリックして、ファイルを保存します。
- ブレークポイントをインポートするには、[ブレークポイント] ウィンドウで、[ファイルからブレークポイントをインポートします] アイコンを 選択し、XML ファイルの場所に移動して、[開く] を選択します。
デバッガー ウィンドウからブレークポイントを設定する
[呼び出し履歴] および [逆アセンブル] デバッガー ウィンドウから、ブレークポイントを設定することもできます。
[呼び出し履歴] ウィンドウでブレークポイントを設定する
呼び出し元の関数が戻る命令または行で中断するには、[呼び出し履歴] ウィンドウでブレークポイントを設定できます。
[呼び出し履歴] ウィンドウでブレークポイントを設定するには:
[呼び出し履歴] ウィンドウを開くには、デバッグ中に一時停止する必要があります。 [デバッグ]>[ウィンドウ]>[呼び出し履歴] を選択するか、Ctrl + Alt + C キーを押します。
[呼び出し履歴] ウィンドウで、呼び出し元の関数を右クリックし、[ブレークポイント]>[ブレークポイントの挿入] を選択するか、F9 キーを押します。
呼び出し履歴の左側余白の関数呼び出し名の横に、ブレークポイントの記号が表示されます。
[ブレークポイント] ウィンドウには、関数内の次に実行可能な命令に対応するメモリ位置に設定されたアドレスとして、呼び出し履歴のブレークポイントが表示されます。
デバッガーはその命令で中断します。
呼び出し履歴の詳細については、「How to: Use the Call Stack Window」 (方法: [呼び出し履歴] ウィンドウの使用) を参照してください。
コード実行時にブレークポイントを目視で追跡する方法については、デバッグを行うときの呼び出し履歴に対するメソッドのマップに関するページを参照してください。
[逆アセンブリ] ウィンドウでブレークポイントを設定する
[逆アセンブリ] ウィンドウを開くには、デバッグ中に一時停止する必要があります。 [デバッグ]>[ウィンドウ]>[逆アセンブリ] を選択するか、Ctrl + Alt + D キーを押します。
[逆アセンブリ] ウィンドウで、中断する命令の左側の余白をクリックします。 命令を選択して、F9 キーを押すか、右クリックして [ブレークポイント]>[ブレークポイントの挿入] を選択することもできます。