ブレークポイント
ブレークポイントは、特定のポイントでプログラムの実行を一時停止する特別なマーカーです。これにより、プログラムの状態と動作を調べることができます。ブレークポイントは、たとえば、特定のコード行に到達したときにプログラムを一時停止するなどの単純なものから、追加の条件をチェックしたり、ログに書き込んだりするなどのより複雑なロジックを含むものまであります。
ブレークポイントは、一度設定すると、一時的なブレークポイントを除き、明示的に削除するまでプロジェクト内に残ります。
ブレークポイントの種類
IntelliJ IDEA では、次のタイプのブレークポイントを使用できます。
行ブレークポイント : ブレークポイントが設定されたコード行に到達したらプログラムを中断します。このタイプのブレークポイントは、実行可能なコード行に設定できます。
メソッドのブレークポイント : 指定されたメソッドまたはその実装の 1 つを開始または終了するとプログラムを中断し、メソッドの開始 / 終了条件を確認できるようにします。
フィールドウォッチポイント : 指定されたフィールドの読み取りまたは書き込みが行われたときにプログラムを中断します。これにより、特定のインスタンス変数との相互作用に対応できます。例: 複雑なプロセスの終了時に、フィールドの 1 つの値が明らかに間違っている場合、フィールドウォッチポイントを設定すると、障害の原因を特定できる場合があります。
例外のブレークポイント :
Throwable
またはそのサブクラスがスローされたときにプログラムを一時停止します。これらは例外条件にグローバルに適用され、特定のソースコード参照を必要としません。スタックトレースとは異なり、例外でアプリケーションを一時停止すると、周囲のコンテキストまたはデータがまだ利用可能な間に調べることができます。
ブレークポイントの設定
行ブレークポイントを設定する
ブレークポイントを設定するコードの実行可能な行でガターをクリックします。または、行にキャレットを置き、Ctrl+F8 を押します。
行内の特定のラムダまたは if-return ステートメントをターゲットにするには、これらのステートメントの近くに表示されるブレークポイントアイコンを使用します。
Java ストリーム操作の場合のように、デバッグする意味のある行上のコードがラムダだけであるシナリオでは、IntelliJ IDEA は行全体ではなくこのラムダにブレークポイントを自動的に設定します。
一時的な行ブレークポイントを設定するには、Ctrl+Alt+Shift+F8 を押します。または、Alt を押したままガターをクリックします。このブレークポイントは、ヒットするとすぐにプロジェクトから削除されます。
メソッドブレークポイントを設定する
メソッドが宣言されている行のガターをクリックします。または、メソッド宣言にキャレットを置いて、Ctrl+F8 を押します。
クラスのデフォルトコンストラクターが呼び出されたときにプログラムを一時停止するには、クラスが宣言されている行のガターをクリックします。または、クラス宣言にキャレットを置いて、Ctrl+F8 を押します。
複数のクラスまたはメソッドをターゲットにするには、メインメニューから追加 Alt+Insert をクリックして、メソッドブレークポイントを選択し、クラスとメソッドを指定します。
を選択し、*
を使用して、識別子の先頭、末尾、全体を一致させます。構文例:
クラス
メソッド
結果
*
print
すべてのクラスの
print()
メソッド (パラメーターリストを使用)Printer
*
Printer
クラスのメソッドPrinter
set*
Printer
クラスのすべての setter*
*
すべてのメソッド (たとえば、起動直後にアプリケーションを一時停止したい場合)
フィールドウォッチポイントを設定する
フィールドが宣言されている行のガターをクリックします。または、行にキャレットを置き、Ctrl+F8 を押します。
例外ブレークポイントを設定する
Ctrl+Shift+F8 を押すか、メインメニューから
を選択します。次に、例外の種類に応じて、次の操作を行います。コンソールに例外のスタックトレースがある場合は、例外の名前の近くにあるブレークポイントの作成ボタンを使用して、この例外のブレークポイントを設定できます。
エディターで例外を宣言または使用しているときに、コンテキストメニュー Alt+Enter を使用してこの例外のブレークポイントを設定できます。
ブレークポイントの管理
ブレークポイントを除去する
例外以外のブレークポイントの場合は、ガター内のブレークポイント。
すべてのブレークポイントの場合: メインメニューで除去 Delete をクリックします。
Ctrl+Shift+F8 に移動し、ブレークポイントを選択して、
誤ってブレークポイントを削除してそのパラメーターを失うのを防ぐために、エディターにドラッグするか、マウスの中央ボタンをクリックして、ブレークポイントを削除することを選択できます。これを行うには、エディターにドラッグまたはマウスの中央ボタンをクリックを選択します。ブレークポイントをクリックすると、それが有効または無効になります。
に移動してブレークポイントのミュート
ブレークポイントでしばらく停止する必要がない場合は、ミュートできます。これにより、デバッガーセッションを移動することなく、通常のプログラム操作を再開できます。その後、ブレークポイントのミュートを解除して、デバッグを続行できます。
デバッグツールウィンドウのツールバーのブレークポイントのミュートボタン
をクリックします。
ブレークポイントを使用可能 / 使用不可にする
ブレークポイントを削除すると、その内部構成は失われます。パラメーターを失うことなく個々のブレークポイントを一時的にオフにするには、無効にすることができます。
非例外ブレークポイントの場合: 右クリックして、必要に応じて有効オプションを設定します。ブレークポイントの削除が割り当てられていない場合は、マウスの中央ボタンで切り替えることもできます。
すべてのブレークポイントの場合: 実行 | ブレークポイントの表示 Ctrl+Shift+F8 をクリックして、リストのブレークポイントをオン / オフにします。
ブレークポイントの移動 / コピー
ブレークポイントを移動するには、それを別の行にドラッグします。
ブレークポイントをコピーするには、Ctrl を押したまま、ブレークポイントを別の行にドラッグします。これにより、宛先に同じパラメーターを持つブレークポイントが作成されます。
設定されたすべてのブレークポイントを表示
ブックマークツールウィンドウですべてのブレークポイントのリストを表示できます。ブレークポイントは、コード内に配置すると、ツールウィンドウの専用リストに自動的に追加されます。
メインメニューで、ブレークポイントリストを展開します。
に移動するか、Alt+2 を押して

ブレークポイントのグループ化
たとえば、特定の問題に対してブレークポイントをマークアウトする必要がある場合は、ブレークポイントをグループにまとめることができます。
ブレークポイントダイアログ Ctrl+Shift+F8 で、グループに配置するブレークポイントを選択し、メニューから を選択します。
ブレークポイントのプロパティを構成する
ブレークポイントのタイプに応じて、特定のニーズに合わせて操作を調整できる追加のプロパティを構成できます。最も使用されるオプションは、インテンションを介して利用できます。
ブレークポイントインテンションにアクセスするには、ブレークポイントのある行にキャレットを置き、Alt+Enter を押します。このオプションは、基本的なブレークポイントプロパティをすばやく設定する必要がある場合に使用します。
プロパティの完全なリストにアクセスするには、ブレークポイントを右クリックして詳細をクリックするか、Ctrl+Shift+F8 を押します。
インテンションリファレンス
インテンション | 説明 |
---|---|
ブレークポイントの除去 | 選択した行のブレークポイントを削除します。 |
ブレークポイントの無効化 | 選択した行のブレークポイントを無効にします。 |
ブレークポイントの編集 | 最もよく使用されるブレークポイントプロパティを含むダイアログを開きます。その他のプロパティについては、詳細をクリックするか Ctrl+Shift+F8 を押します。 |
クラスでのみ停止 | クラスフィルターを適用して、現在のクラスから派生したクラスを除外します。 |
クラスに立ち寄らないでください | 現在のクラスを除外するクラスフィルターを適用します。 |
現在のオブジェクト内でのみ停止する | インスタンスフィルターを適用して、現在のインスタンスのみを含め、他のインスタンスをすべて除外します。このアクションは、非静的メソッドでのみ使用できます。 |
から呼び出された場合のみ停止 | 呼び出し元フィルターを適用して、スタック内の前のフレームに対応するメソッドを除くすべてのメソッドを除外します。 |
から呼び出された場合は停止しないでください | 呼び出し元フィルターを適用して、スタック内の前のフレームに対応するメソッドを除外します。 |
ブレークポイントのプロパティリファレンス
この章では、ブレークポイントで使用できる機能について説明します。
有効
プロジェクトから削除せずに一時的にブレークポイントを無効にするには、チェックボックスをオフにします。無効化されたブレークポイントは、ステップ実行中にスキップされます。
IntelliJ IDEA を構成して、ブレークポイントを完全に削除するのではなく、クリック時に有効 / 無効にすることができます。これを行うには、ブレークポイントの除去オプションをエディターにドラッグまたはマウスの中央ボタンをクリックに設定します。
に移動し、中断
ブレークポイントに達したときにプログラムの実行を一時停止するかどうかを指定します。
非中断ブレークポイントは、プログラムを一時停止せずに何らかの式をログに記録する必要がある場合 (たとえば、メソッドが何回呼び出されたかを知る必要がある場合)、またはヒット時に依存するブレークポイントを有効にするトリガーブレークポイントを作成する必要がある場合に役立ちます。
プログラムの実行を一時停止するブレークポイントには、次のポリシーを使用できます。
すべて : スレッドのいずれかがブレークポイントに達すると、すべてのスレッドが中断されます。
スレッド : ブレークポイントにヒットしたスレッドのみが中断されます。
ポリシーをデフォルトのポリシーとして使用する場合は、デフォルトにするボタンをクリックします。
条件
このオプションは、ブレークポイントがヒットするたびにチェックされる条件を指定するために使用されます。条件が true
と評価された場合、選択されたアクションが実行されます。それ以外の場合、ブレークポイントは無視されます。
式の結果は、return ステートメントから取得されます。return ステートメントがない場合、結果はコードの最後の行から取得されます。
条件の本文では、次を使用できます。
宣言、ループ、匿名クラスなどを含む複数のステートメント
this
(非静的コンテキスト内)、たとえば、現在の例外を参照するため:!(this.entries.isEmpty())
追跡されたインスタンスを式に含めるか、ブールフィールドをチェックするためのラベル :
trackedObject_DebugLabel.isComplete()
式を評価するときは、プログラムの動作や結果に影響を与える可能性があるため、副作用が発生する可能性があることを必ず認識してください。
ログオプション
ブレークポイントに到達すると、次のログがコンソールに記録されます。
"Breakpoint hit" メッセージ :
Breakpoint reached at ocean.Whale.main(Whale.java:5)
のようなログメッセージ。スタックトレース : 現在のフレームのスタックトレース。これは、プログラムの実行を中断することなく、このポイントに至ったパスを確認する場合に役立ちます。
評価して記録 :
"Initializing"
やusers.size()
などの任意の式の結果。式はアクセス修飾子を無視し、ブレークポイントが設定されている行のコンテキストで評価されます。
式の結果は return ステートメントから取得されます。return ステートメントがない場合、結果はコードの最後の行から取得されます。最後の行は式である必要はなく、リテラルでもかまいません。これを使用して、カスタムメッセージを生成したり、プログラムの実行中にいくつかの値を追跡したりできます。
式を評価するときは、プログラムの動作や結果に影響を与える可能性があるため、副作用が発生する可能性があることを必ず認識してください。
ログブレークポイントを設定する
(オプション) ログに記録する式がエディター内の目の前にある場合は、それを選択します。
Shift を押したままガターをクリックします。
一度ヒットしたら除去する
ブレークポイントを 1 回ヒットした後、プロジェクトから削除するかどうかを指定します。
次のブレークポイントに到達するまで無効にする
次のブレークポイントに到達するまで無効にするボックスでブレークポイントを選択すると、現在のブレークポイントのトリガーとして機能します。これにより、指定したブレークポイントに到達するまで現在のブレークポイントが無効になります。
これが発生した後に再び無効にするか、有効のままにするかを選択することもできます。
このオプションは、特定の条件下または特定のアクションの後でのみプログラムを中断する必要がある場合に役立ちます。この場合、通常、トリガーブレークポイントはプログラムの実行を停止するために必要ではなく、non-suspending になります。
フィルター
IntelliJ IDEA デバッガーを使用すると、クラス、インスタンス、呼び出し元メソッドをフィルターで除外し、必要な場合にのみプログラムを中断することにより、ブレークポイント操作を微調整できます。
次のタイプのフィルターを使用できます。
キャッチクラスフィルター : 指定されたクラスの 1 つで例外がキャッチされる場合にのみ、プログラムを中断できます。例外ブレークポイントでのみ使用できます。
インスタンスフィルター : ブレークポイント操作を特定のオブジェクトインスタンスに制限します。このタイプのフィルターは、非静的コンテキストでのみ有効になります。
クラスフィルター : ブレークポイント操作を特定のクラスに制限します。例外の場合、このフィルターはスローサイトクラスと一致します。
呼び出し元フィルター : 現在のメソッドの呼び出し元に応じて、ブレークポイント操作を制限します。特定のメソッドから現在のメソッドが呼び出される(または呼び出されない)場合にのみ、ブレークポイントで停止する必要がある場合に選択します。
フィルターを設定するには、テキストフィールドの近くにあるボタンをクリックしてダイアログを使用するか、テキスト形式で定義します。テキスト形式の場合は、次の構文を使用します。
クラスとメソッドは、完全修飾名を使用して指定されます。クラス名でフィルターが指定されている場合、フィルターはクラス自体と、継承を介してそのメンバーを使用するすべてのサブクラスを指します。
*
ワイルドカードで開始または終了するパターンを使用して、クラスまたはメソッドのグループ(*.Foo
またはjava.*
など)を定義できます。パターンを介して指定されたフィルターは、完全修飾名がこのパターンに一致するクラス / メソッドを指します。オブジェクトインスタンスは、インスタンス ID を使用して指定されます。オブジェクトがスコープ内にある場合、またはメモリタブを使用している場合、変数タブでオブジェクト ID を見つけることができます。
クラス名、呼び出し元メソッド、パターン、インスタンス ID はスペースで区切られます。
クラスまたは呼び出し元メソッドを除外するには、名前の前に
-
を入力します。呼び出し元フィルターでは、パラメーターと戻り値の型に記述子を使用します(例:
mypackage.MyObject.addString(Ljava/lang/String;)V
)。記述子の詳細については、Oracle(英語) の公式ドキュメント(英語)を参照してください。
フィルターの例:
| |
| 次のシグネチャーを持つ |
| |
通過数
ブレークポイントが特定の回数ヒットした後にのみ機能することを指定します。これは、長時間実行されるループでアプリケーションを一時停止したり、頻繁に発生するイベントを選択的にログに記録したりするシナリオをデバッグする場合に役立ちます。
カウントが完了すると、リセットされて再び開始されます。つまり、通過数が 10
に設定されている場合、ブレークポイントは 10 回ヒットするごとに機能します。
通過数と条件の両方が設定されている場合、IntelliJ IDEA は最初に条件を満たし、次に通過数をチェックします。
フィールドアクセス / 変更
フィールドアクセス | フィールドの読み取り中にウォッチポイントを機能させる場合に選択します。 |
フィールドの変更 | フィールドへの書き込み時にウォッチポイントを機能させる場合に選択します。 |
エミュレート
このオプションを有効にすると、IntelliJ IDEA は、遅い「true」メソッドブレークポイントを使用する代わりに、メソッドの最初と最後のステートメントに行ブレークポイントの組み合わせを設定します。エミュレートされたメソッドブレークポイントはデバッグパフォーマンスを向上させるため、デフォルトで使用されます。
リモートコードをデバッグしている場合、または行番号情報のないネイティブメソッドまたはクラスにブレークポイントを設定する必要がある場合にのみ、このオプションを無効にすることをお勧めします。
メソッドの入り口 / 出口
メソッド開始 | メソッドまたはその子孫に入った後にブレークポイントを機能させる場合に選択します。 |
メソッド終了 | メソッドまたはその子孫が戻る前にブレークポイントを機能させる場合に選択します。 |
キャッチ / キャッチされない例外
捕捉した例外 | 指定した例外がキャッチされたときにブレークポイントを機能させる場合に選択します。 |
未捕捉の例外 | 指定した例外がキャッチされなかった場合にブレークポイントを機能させる場合に選択します。これにより、未処理の例外によってプログラムまたはスレッドがクラッシュする前に、プログラムの状態を調べて原因を検出できます。 |
ブレークポイントのステータス
ブレークポイントには、次のステータスがあります。
状況 | 説明 |
---|---|
検証済み | デバッガーセッションを開始した後、デバッガーはプログラムをブレークポイントで一時停止することが技術的に可能かどうかをチェックします。はいの場合、デバッガーはブレークポイントを検証済みとしてマークします。 |
警告 | ブレークポイントでプログラムを一時停止することが技術的に可能ですが、それに関連する問題がある場合、デバッガーはブレークポイントのステータスを警告に設定します。これは、たとえば、メソッドの実装の 1 つでプログラムを一時停止することが不可能な場合に発生することがあります。 |
無効 | ブレークポイントでプログラムを一時停止することが技術的に不可能な場合、デバッガーはそれを無効としてマークします。これは、その行に実行可能なコードがないためよく発生します。 |
非アクティブ / 依存 | ブレークポイントは、別のブレークポイントにヒットするまで無効になるように構成されている場合、非アクティブ / 依存としてマークされますが、これはまだ発生していません。 |
ミュート | すべてのブレークポイントはミュートされているため、一時的に非アクティブです。 |
無効 | それはされているため、このブレークポイントが一時的にアクティブで無効。 |
中断しない | このブレークポイントには中断ポリシーが設定されているため、ヒットしたときに実行が中断されることはありません。 |
ブレークポイントアイコン
タイプとステータスに応じて、ブレークポイントは次のアイコンでマークされます。
行 | メソッド | フィールド | 例外 | |
---|---|---|---|---|
標準 | | | | |
無効 | | | | |
検証済み | | | | |
ミュート | | | | |
非アクティブ / 依存 | | | | |
ミュートされた非アクティブ / 依存 | | | | |
ミュート無効 | | | | |
中断しない | | | | |
確認済みの一時停止なし | | | | |
無効 | |
生産性のヒント
- 「printf」デバッグにブレークポイントを使用する
コードに出力ステートメントを挿入する代わりに、non-suspending ログブレークポイント(他のデバッガーではウォッチポイントと呼ばれることもあります)を使用します。これにより、デバッグログメッセージを処理する、より柔軟で集中化された方法が提供されます。
- ロギングブレークポイントをより迅速に設定する
non-suspending ロギングブレークポイントを設定するには、Shift を押しながらガターをクリックします。これはプログラムの実行を中断せず、代わりに
Breakpoint reached at ocean.Whale.main(Whale.java:5)
のようなメッセージを記録します。エディターの前にある式をログに記録する場合は、Shift を押しながらガターをクリックする前に、式を選択します。- ブレークポイントの説明を追加する
プロジェクトに多数のブレークポイントがある場合、検索を容易にするためにブレークポイントに説明を追加できます。これを行うには、ブレークポイントダイアログ Ctrl+Shift+F8 のブレークポイントを右クリックし、メニューから説明の編集を選択します。これで、ブレークポイント名の入力を開始すると、フォーカスが取得されます。
- ラムダ式とメソッド参照
JVM の設計により、ラムダ式とは異なり、メソッド参照はスタックトレースで意味のある情報を提供しません。さらに、メソッド参照にブレークポイントを設定することはできません。メソッド参照によって重要な部分の追跡可能性が低下する場合は、代わりにラムダを使用することを検討してください。
- 致命的なエラーの原因を診断する
例外ブレークポイントは
Throwable
で機能するため、Error
のサブクラスがスローされたときに使用してプログラムを中断することもできます。これは、OutOfMemoryError
やStackOverflowError
などのエラーの原因を調査できます。それらに例外ブレークポイントを設定すると、クラッシュする前にプログラムで何が起こったのかを調べることができます。- 並行性の問題についてプログラムをテストする
マルチスレッドプログラムが同時実行性に関して堅牢であるかどうかを確認する良い方法は、ヒット時に 1 つのスレッドのみを一時停止するブレークポイントを使用することです。単一のスレッドを停止すると、アプリケーションの設計上の問題が明らかになる場合がありますが、それ以外の場合は明らかではありません。
関連ページ:

ブックマーク
大規模なプロジェクトで作業する場合、ファイルやフォルダーの検索には時間がかかる場合があります。そのような場合、IntelliJ IDEA はブックマークを備えています。必要なコード行をブックマークして、見つけやすくすることができます。他のプロジェクトアイテムよりも頻繁に必要なプロジェクトアイテム(ファイル、フォルダー、パッケージ、モジュール、クラス)をブックマークすることもできます。すべてのブックマークはブックマークツールウィンドウのリストにグループ化されており、メインメニューからを選択するか、...

プログラムのステップスルー
ステップは、プログラムの段階的な実行を制御するプロセスです。IntelliJ IDEA は、次の行に直接移動する必要があるか、中間のメソッド呼び出しもインスペクションする必要があるかなど、戦略に応じて使用される一連のステップアクションを提供します。ステップボタンは、デバッグウィンドウのツールバーにあります。ステップオーバー:現在のコード行をステップオーバーし、ハイライトされた行にメソッド呼び出しが含まれている場合でも、次の行に移動します。メソッドの実装はスキップされ、呼び出し元メソッドの次の行...

チュートリアル: 並行性の問題を検出する
同時実行関連のバグはランダムな性質を持つため、シングルスレッドアプリケーションのバグよりも扱いが難しいことがよくあります。アプリは 1,000 回問題なく実行されても、明らかな理由もなく予期せず失敗することがあります。このチュートリアルでは、マルチスレッドアプリのデバッグと分析のコア原則を示すコード例を分析します。問題:同時実行性に関連するバグの一般的な例は競合状態です。これは、共有データが複数のスレッドによって適切に同期されずに同時に変更された場合に発生します。このようなコードは、2 つのス...

中断されたプログラムを調べる
デバッガーセッションが開始されると、デバッグツールウィンドウが表示され、次のいずれかが発生するまでプログラムが正常に実行されます。ブレークポイントがヒットしました、プログラムを手動で一時停止する、その後、プログラムは中断され、現在の状態を調べたり、実行を制御したり、実行時にさまざまなシナリオをテストしたりできます。フレームを調べる:プログラムの状態はフレームで表されます。プログラムが一時停止すると、現在のフレームスタックがデバッグツールウィンドウのフレームタブに表示されます。フレームはアクティ

JVM ヒープ内のオブジェクトを分析する
デバッグ時に、メモリタブを使用してヒープ内のオブジェクトを確認できます。IntelliJ IDEA を使用すると、個々のクラスインスタンスを追跡し、オブジェクトが生成または保持される条件を分析できます。この情報は、メモリリークとその原因を検出できます。一部のエラーは見落としやすいため、コード検査だけでは手がかりが得られない場合があります。例: 内部クラスによって外部クラスがガベージコレクションの対象にならない場合があり、その結果が発生する可能性があります。このような場合、メモリタブと参照オブジェ...

コードのデバッグ
IntelliJ IDEA は、Java コード用のデバッガーを提供します。インストール / 有効化されたプラグインに応じて、他の言語で記述されたコードをデバッグすることもできます。デバッグセッション中に、デバッガーをアタッチしてプログラムを起動します。デバッガーの目的は、プログラムの実行を妨害し、内部で何が起こっているかに関する情報を提供することです。これにより、プログラムのバグを検出して修正するプロセスが容易になります。デバッグする前にでデバッグ情報を生成するオプションがオン(デフォルト設定...