Android Studio最速入門~効率的にコーディングするための使い方

第39回 デバッガについて

この記事を読むのに必要な時間:およそ 8 分

応用編

応用編ではデバッガに関するTIPSや操作をQ&A方式で紹介します。

Hotswapはできないの?

デバッグ中にクラスファイルを入れ替えるHotswapですが,通常のJavaアプリケーションなら可能ですが,Androidアプリケーション相手にはできません。

既存のAndroidアプリケーションにデバッガ接続するには?

Androidエミュレータ,または実機にてデバッグしたいアプリケーションを実行しておき,ツールバーにある"Attach debugger to Android process"を使って接続します。

図31 "Attach debugger to Android process"の実行例

図31 

「Debugツールウィンドウ」にある "Rerun"」より,素早くデバッグを開始できるのでオススメです。

なお,プログラムを修正して,それを再度デプロイしてデバッグを継続したい場合は,"Attach debugger to Android process"でも「Debugツールウィンドウ」の"Rerun"ではなく,"Debug"を実行します。Android Studioでは,こうしないと再デプロイが行われません。

デバッグ中のフレームの操作はできますか?

できるけど,できません。Android Studioの機能としてフレーム操作を持っているのですが,Androidアプリケーションでは一部の機能が反応しません。

図32 Androidアプリケーションでは"Drop Frame"が使えない

図32 Androidアプリケーションでは

フレームの破棄("Drop Frame")はできませんが,⁠Framesペイン」から特定のフレームを参照することは可能です。ただし,Eclipseのようにコールスタックをコピペする機能はありません。

より高度なブレイクポイントの設定はできますか?

できます。ブレイクポイントを右クリックして詳細設定をポップアップさせるか,"View Breakpoints..."で表示する「Breakpoints」ダイアログから設定できます。

スレッドの停止・全体の停止
「Suspend」で,ブレイクポイントに到達したときに,全体を停止するか(All)⁠該当するスレッドのみを停止するか(Thread)を指定します。また「Suspend」そのものもON/OFF可能で,OFFにすれば停止せずに素通りします。
特定の条件を満たしたときにブレイクポイントを有効にする
「Condition」に式を書き,その式が true のときにブレイクポイントが有効になります。⁠Condition」には,ブレイクポイント近辺のコンテキスト(変数や引数など)が利用できます。どのようなコンテキストが利用できるかは「Condition」でのコード補完で確認することができます。

図33 ⁠Condition」でもコード補完が利く

図33 「Condition」でもコード補完が利く

インスタンスを指定したブレイクポイント
「Instance fileters」にインスタンスIDを指定することで,特定のインスタンスでのみ反応するブレイクポイントを作ることができます。指定できるインスタンスIDはlongの整数(16進表記はNG)で,スペース区切りで複数指定できます。
呼び出し回数の設定
「Pass count」に数字を設定すると,そのブレイクポイントは指定した値に達するまでプログラムを停止しません。
他のブレイクポイントと連動するブレイクポイント
「指定したブレイクポイントを通過した時に有効になるブレイクポイント」です。ユニークな機能なのですが,イマイチ使いどころを見つけられずにいます。

図34 2つのブレイクポイント

図34 2つのブレイクポイント

図35のようなケースで「⁠2)(1)を通過したときのみ有効」になって欲しいとき,次のように設定を行います。

図35 ⁠2)のブレイクポイントの設定

図35 (2)のブレイクポイントの設定

(2)のブレイクポイント側で「Disabled until selected breakpoint is hit」(1)のブレイクポイントを指定します。これにより(2)(1)を通過するまで有効になりません。⁠After breakpoint was hit」(2)のブレイクポイントに到達した後の処理を指定します。再び無効にするなら「Disable again」を,有効にしたままにするなら「Leave enabled」を指定します。

Eclipseの場合,この他に「特定の変数の値が変わったどうか」を条件に設定できるようですが,Android Studioにはその機能はありません。

「Class filters」って何に使うの?

ブレイクポイントの設定画面にある「Class filters」ですが,本編ではしれっと無視していましたが,これはいったい何でしょう?「Instance filters」がインスタンスIDでブレイクポイントをフィルタするように,こちらはクラスを指定してブレイクポイントをフィルタします。しかし行ブレイクポイントにしろ,メソッドブレイクポイントにしろ,特定のクラスに対してブレイクポイントを設定しているのに「Class filters」とは不思議な話です。

あまり知られていませんが,メソッドブレイクポイントは「特定のクラス」ではなく「クラスのパターン」に対して設定することができます。⁠Breakpoints」ダイアログでメソッドブレイクポイントを追加するときのみ,図36のように「Class pattern」を設定することができます。ただし,パターン指定できるのはクラスのみで,メソッドにパターンは指定できません。

図36 ⁠Add Method Breakpoint」ダイアログ(クリックすると動きがわかります)

「⁠Add Method Breakpoint」ダイアログ` &title=`図36 ⁠Add Method Breakpoint」ダイアログ` &width=`400` />

※ バグか仕様かわかりませんが,Class patternには制約があるようです("*List"はOKだが,"Note*"のようなパターンはNG)⁠

このようなケースだと「Class filters」も意味があります。⁠Class filters」をONにして「...」ボタンを押すと図37のような「Class Filters」ダイアログが表示されるので,有効にしたいクラス(Class Filters)や無視したいクラス(Class Exclusion Filters)をそれぞれ設定します。

図37 ⁠Class Filters」ダイアログ

図37 「Class Filters」ダイアログ

個人的には,ここまでブレイクポイントを活用するのはやり過ぎだと思います。この記事を執筆するため実機検証したときに何度が遭遇したのですが,デバッガを起動してもAndroidアプリケーションが「Waiting For Debugger」のまま先に進まないことがありました。

たいていはメソッドブレイクポイントの設定間違いだったのですが,そこに辿り着くまですごくハマりました。同じ轍を踏まないよう気をつけてください。

図38 変なところにブレイクポイントを仕込んだ結果

図38 変なところにブレイクポイントを仕込んだ結果

著者プロフィール

今井勝信(いまいまさのぶ)

システムエンジニア。日本ユニシス株式会社所属。仙台在住。

Android開発はまったくやったことがないけれどIntelliJ IDEAが大好き。

Twitter: @masanobuimai