以前、IntelliJ IDEAでJava開発するときに使える基本的なブレークポイントについて紹介しました。
今回は、そのときに力尽きて書けなかった「条件付きブレークポイント」機能について紹介したいと思います。条件付きブレークポイントを使うと、ブレークポイントで実行中断する条件をより柔軟に制御できるようになります。毎日使うような機能ではありませんが、いざというときに知っておいて損はないと思います。
- 条件式が成立したときだけストップ
- 一定回数ごとにストップ
- 別のブレークポイントにヒットした後でストップ
- ストップせずにログ出力
条件式が成立したときだけストップ
繰り返し実行される処理にブレークポイントを設定するときに、毎回無条件でストップするのではなく、ループカウンタの値やノードの種類が特定の条件(ex. i == 50
, nodeType != ELEMENT_NODE
)を満たしたときだけストップさせたいことがあります。
このような場合には、ブレークポイントの [Edit] - [Condition] に任意の条件式を指定してやることで望みの結果を得ることができます。
上の例では、i < 50
の間はブレークポイントにヒットせず実行が続き、 i == 50
になったときに初めて実行が中断されます。また、[Condition] は真偽値を返す式であれば自由に指定できるので、次のような式も設定できます。この例では、 i == 11
のときに条件式が成立して実行中断されます。
一定回数ごとにストップ
先ほどのループカウンタと似た例として、偶数回目だけ実行を中断したり、10回ずつ実行を中断したり、と一定回数ごとに処理をストップさせたいときに使えるのが、[Pass count] 設定です。ブレークポイントの [Edit] - [More] から詳細設定ダイアログを表示することで指定できます。
上の例では、i == 15
, i == 30
, i == 45
, ... と15回目ずつストップします。ちょうど「FizzBuzz」と出力するときですね。
別のブレークポイントにヒットした後でストップ
使い道がなさそうでたまに役立つのが、ブレークポイントに依存関係をもたせる機能です。ブレークポイントの詳細設定ダイアログで、[Disable until selected breakpoint is hit] に先行する他のブレークポイントを指定してやると、そのブレークポイントがヒットするまでは後続のブレークポイントも無視されます。
上の例では、i == 50
のときに5行目のブレークポイントへ初めてヒットし、このタイミングで10行目のブレークポイントが有効になります。そして、i == 55
になったときに10行目のブレークポイントで処理が中断されることになります。
実際の利用シーンとしては、例えば外部公開している3つのメソッドA, B, Cが内部処理としては共通のメソッドXを使っている場合に、B → Xという経路で呼び出された場合だけ実行中断してデバッグするような場合に使えます。
ストップせずにログ出力
単にブレークポイントでストップさせるのではなく、特定の式を評価してログ出力させることもできます。文字列を返すような式であれば自由に設定できるので、デバッグ情報をログ出力しておいてあとで全体の出力を確認しながらデバッグしたいときには便利かもしれません。とはいえ、私はほとんど使ったことはないのですが…
まとめ
IntelliJ IDEAでJava開発する際に使えるブレークポイント機能について、より詳細に停止条件を制御するテクニックをいくつか紹介しました。スクリーンショットを見ていただければ分かる通り、本当はインスタンスIDやクラスの種類で絞り込む機能もあるのですが、サンプルコードを考えるのが面倒だったので今回は割愛させていただきました。
このあたりのブレークポイントの知識は、知らなくてもさほど日々の開発には影響がありませんが、知っているとデバッグ効率が上がると思いますので、ぜひ活用していただければと思います。