GameWith Developer Blog

GameWith のエンジニア、デザイナーが技術について日々発信していきます。

Android Studio (IntelliJ IDEA)のデバッグコツ - 特殊ブレークポイントの使い方 #techwith #gamewith

はじめまして、GameWithでAndroidエンジニアをしているgiです。

今回はIntelliJ IDEAのデバッグについて話をします。

タイトルにはAndroid Studioと書いてますけど。基本IntelliJ系のIDEの使い方は同じですので、WebStorm、PhpStrom、PyCharmなども通用します。

本文にあるサンプルはAndroid StudioとJavaを使っています。

目次

まずはブレークポイントの種類

Line breakpoint

f:id:k_gi:20191121144840p:plain

デバッグしたい行に設定するだけ、一番普通のブレークポイントです。

Method breakpoint

f:id:k_gi:20191121145303p:plain

設定する箇所はデバッグしたいメソッドを定義する行です。デバッグするとき、デフォルトはそのメソッドの1行目に止まります。

f:id:k_gi:20191121145725p:plain

そのブレークポイント上で右クリックして、Method entryMethod exitで止まるところを設定できます。Method entryはメソッドの1行目、Method exitの最後の行です。デフォルトは全部選択されてます。

f:id:k_gi:20191121150059p:plain クラスのメソッドだけではなく、インターフェイスのメソッドにも設定できます。インターフェイスのメソッドに設定してデバッグすると、そのインターフェイスを実装したすべてのクラスの同じメソッドに止まります。

コード上にインターフェイスしか分からない場合、このブレークポイントがよく役立ちます。

Field breakpoint

f:id:k_gi:20191121151538p:plain 設定する箇所はフィールドを定義した行です。デバッグするとき、デフォルトはそのフィールドの値を変化するところです。

f:id:k_gi:20191121152451p:plain

Method breakpointと同じ、ブレークポイント上で右クリックすると、Field accessFiled modificationで止まるところを設定できます。Field accessを設定すると、そのフィールドをアクセスたびに止まります。デフォルトははFiled modificationのみ。

いつ、どこでフィールドの値が変化したを知らない場合、このブレークポイントがあれば楽になります。

Exception breakpoint

他のブレークポイントと違って、設定するところはdebug barにあります:

f:id:k_gi:20191121153913p:plainf:id:k_gi:20191121154112p:plain

サンプルはJavaので、Java Exception Breakpointsを選択する。そのあと、Exceptionの種類を設定できます:

f:id:k_gi:20191121154233p:plain

サンプルはIllegalStateExceptionを選択する。実際サンプルコードを使ってデバッグすると、Exceptionを発生するところに止まります:

f:id:k_gi:20191121154433p:plain

次はブレークポイントの特殊設定

サンプルには一番普通のLine breakpointを使っています、他のブレークポイントも同じ設定できます。 特殊の設定は基本ブレークポイント上に右クリックして、表示したDialog上で設定します。

Enabled

f:id:k_gi:20191121155352p:plain

ブレークポイントが 有効 / 無効 の切り替え。

Suspend

f:id:k_gi:20191121155601p:plain

  • チェックボックス:このブレークポイントがヒットするとき、スレッドが止まるかどうかの切り替え。外すと、ブレークポイントに止まらないですが、まだ有効です。下のEvaluate and logと併用する場合は多いです。
  • All / Thread:ブレークポイントがヒットするとき、すべてのスレッドを止まるか、そのスレッドだけ止まるかの設定です。

Condition

ブレークポイントを止まる条件を設定できます。いわゆる条件付きブレークポイントのことです。

設定した 判別式 / コードブロック は必ず True / False を返却する必要があります。

例えばLine breakpointのサンプルに、ブレークポイントにi==5の判別式を設定して、デバッグすると:

f:id:k_gi:20191121160740p:plain

iの値が5のときのみ、ブレークポイントに止まります。(ヒットは毎回ヒットする)

Evaluate and log

右クリックで出たDialogに、Moreをクリックして、より詳しく設定ができるDialogを開けます:

f:id:k_gi:20191121161253p:plain f:id:k_gi:20191121161604p:plain

その中に、Evaluate and logのチェックボックスをチェックして、出力したい判別式を入手する。例えば:

f:id:k_gi:20191121161839p:plain

そのままデバッグすると、毎回止まるので、Logだけ出力したい場合、上で紹介したSuspendのチェックボックスを外します。実行した結果は:

f:id:k_gi:20191121162038p:plain

hello world xは元々メソッドの実行結果です、"current i: x"はブレークポイントから出力したものです。

ちなみにAndroid上でlogを出力場合、出力したlogはLogcatではなく、Debug Consoleにあります。

Remove once hit

1回のみのブレークポイント、1回止まると、自動的にブレークポイントを削除します。

Disable until breakpoint is hit

f:id:k_gi:20191121163844p:plain

すでに存在したブレークポイントから依存先を選択できます。依存したブレークポイントをヒットする前はずっと無効の状態です。依存先がヒットしたあと、このブレークポイントは有効になります。複雑なケースでデバッグする場合はおすすめです。

最後、Evaluate Expression

ブレークポイントが止まってる状態で、Option + F8(Mac)か、debug barのボタンをクリックかで開けるDialog:

f:id:k_gi:20191121164620p:plain f:id:k_gi:20191121164641p:plain

その中に、自分が実行したいコードブロックを入力して、実行できます。変数の値を見るとか、値を変えるとか、判別式を実行するとか、いろいろなことができます。

まとめ

以上はIntelliJ系のIDEでデバッグするとき使えるコツみたいなもの。自分が書いたコードではなく、SDKにあるコードをデバッグするとき、結構楽になります。

公式のドキュメント:https://www.jetbrains.com/help/idea/using-breakpoints.html

終わりに

GameWithのDeveloper向けTwitterアカウントを開設しました。

技術やブログの更新情報などを発信するので良かったらフォロー宜しくお願いします!

twitter.com