はじめまして、GameWithでAndroidエンジニアをしているgiです。
今回はIntelliJ IDEAのデバッグについて話をします。
タイトルにはAndroid Studioと書いてますけど。基本IntelliJ系のIDEの使い方は同じですので、WebStorm、PhpStrom、PyCharmなども通用します。
本文にあるサンプルはAndroid StudioとJavaを使っています。
目次
まずはブレークポイントの種類
Line breakpoint
デバッグしたい行に設定するだけ、一番普通のブレークポイントです。
Method breakpoint
設定する箇所はデバッグしたいメソッドを定義する行です。デバッグするとき、デフォルトはそのメソッドの1行目に止まります。
そのブレークポイント上で右クリックして、Method entry
、Method exit
で止まるところを設定できます。Method entry
はメソッドの1行目、Method exit
の最後の行です。デフォルトは全部選択されてます。
クラスのメソッドだけではなく、インターフェイスのメソッドにも設定できます。インターフェイスのメソッドに設定してデバッグすると、そのインターフェイスを実装したすべてのクラスの同じメソッドに止まります。
コード上にインターフェイスしか分からない場合、このブレークポイントがよく役立ちます。
Field breakpoint
設定する箇所はフィールドを定義した行です。デバッグするとき、デフォルトはそのフィールドの値を変化するところです。
Method breakpointと同じ、ブレークポイント上で右クリックすると、Field access
とFiled modification
で止まるところを設定できます。Field access
を設定すると、そのフィールドをアクセスたびに止まります。デフォルトははFiled modification
のみ。
いつ、どこでフィールドの値が変化したを知らない場合、このブレークポイントがあれば楽になります。
Exception breakpoint
他のブレークポイントと違って、設定するところはdebug barにあります:
サンプルはJavaので、Java Exception Breakpoints
を選択する。そのあと、Exceptionの種類を設定できます:
サンプルはIllegalStateException
を選択する。実際サンプルコードを使ってデバッグすると、Exceptionを発生するところに止まります:
次はブレークポイントの特殊設定
サンプルには一番普通のLine breakpointを使っています、他のブレークポイントも同じ設定できます。 特殊の設定は基本ブレークポイント上に右クリックして、表示したDialog上で設定します。
Enabled
ブレークポイントが 有効 / 無効 の切り替え。
Suspend
- チェックボックス:このブレークポイントがヒットするとき、スレッドが止まるかどうかの切り替え。外すと、ブレークポイントに止まらないですが、まだ有効です。下の
Evaluate and log
と併用する場合は多いです。 - All / Thread:ブレークポイントがヒットするとき、すべてのスレッドを止まるか、そのスレッドだけ止まるかの設定です。
Condition
ブレークポイントを止まる条件を設定できます。いわゆる条件付きブレークポイントのことです。
設定した 判別式 / コードブロック は必ず True / False を返却する必要があります。
例えばLine breakpointのサンプルに、ブレークポイントにi==5
の判別式を設定して、デバッグすると:
iの値が5のときのみ、ブレークポイントに止まります。(ヒットは毎回ヒットする)
Evaluate and log
右クリックで出たDialogに、More
をクリックして、より詳しく設定ができるDialogを開けます:
その中に、Evaluate and log
のチェックボックスをチェックして、出力したい判別式を入手する。例えば:
そのままデバッグすると、毎回止まるので、Logだけ出力したい場合、上で紹介したSuspend
のチェックボックスを外します。実行した結果は:
hello world x
は元々メソッドの実行結果です、"current i: x"はブレークポイントから出力したものです。
ちなみにAndroid上でlogを出力場合、出力したlogはLogcatではなく、Debug Consoleにあります。
Remove once hit
1回のみのブレークポイント、1回止まると、自動的にブレークポイントを削除します。
Disable until breakpoint is hit
すでに存在したブレークポイントから依存先を選択できます。依存したブレークポイントをヒットする前はずっと無効の状態です。依存先がヒットしたあと、このブレークポイントは有効になります。複雑なケースでデバッグする場合はおすすめです。
最後、Evaluate Expression
ブレークポイントが止まってる状態で、Option + F8
(Mac)か、debug barのボタンをクリックかで開けるDialog:
その中に、自分が実行したいコードブロックを入力して、実行できます。変数の値を見るとか、値を変えるとか、判別式を実行するとか、いろいろなことができます。
まとめ
以上はIntelliJ系のIDEでデバッグするとき使えるコツみたいなもの。自分が書いたコードではなく、SDKにあるコードをデバッグするとき、結構楽になります。
公式のドキュメント:https://www.jetbrains.com/help/idea/using-breakpoints.html
終わりに
GameWithのDeveloper向けTwitterアカウントを開設しました。
技術やブログの更新情報などを発信するので良かったらフォロー宜しくお願いします!