DS-5 CEでJNIを使ったJavaとNativeの混合デバッグ

基本的にはオフィシャルサイトの記事に沿っていきますが、本サイトはAndroid ADT Bundle(ADT-21.0.x)にDS-5 CEをインストールしている事と、JNIからのファンクション呼び出し、それに伴うJavaとNativeコードの混合デバッグを行い、その点を捕捉しながら解説していきます。
2013.01.31 実機デバッグに関して追記
JNIを使用したソースコードレベルのデバッグは他のサイトでも色々試行錯誤していますが、結論から言うと、ADTのデフォルトのデバッガとDS-5のデバッガを両方駆使して行う事になります。
javaコードでデバッグするときと同様にデバッグを開始し、javaレベルのブレイクポイントで止めておき、DS-5のデバッガを接続させるという手順を踏みます。試行錯誤している最中ですが、JNIをデバッグできて、eclipse上で手軽に設定が進められるのは、この方法しかないように思います。

まずアプリケーションをデバッグ可能にするためにManifestファイルのApplicationタブからDebuggableをtrueに設定します。これでパッケージを作成する際にgdbserverが組み込まれ、詳細なデバッグが可能となります。
20130118_AndroidManifest_debuggable_true

順番は前後しても構いませんが、続いてndkのビルドコマンドを編集します。
プロジェクトのプロパティより、Use defaultのチェックを外して[ ndk-build NDK_DEBUG=1 ]に書き換えます。コンフィグレーションを新たに設定してもいいですが、現状の統合環境の整備具合を考えると、都度編集しても大差はないように思います。
20130123_modifiy_build_command

そしてDS-5デバッグのPerspectiveを開きましょう。
20130117_DS5
初回起動では、このような構成になっています。
続いて、DS-5 CEデバッグ – ARMのデバッグ設定で解説している通り、gdbserverの更新ですが、この説明ではいったい何をどうしたら良いのか頭をひねりました。結論から言うと

Debugging an Android App with DS-5 Community Edition

このオフィシャルの動画が全て解決してくれます。(ndkとDS5のバージョンが異なるため、作業は少々変わりますが)
[ヘルプ]→[ARM Extras…]を開くとエクスプローラでDS-5のgdbserverの保存された場所の一階層上のarmフォルダが開きます。
20130123_arm_folder
実際にリネームを指示されているファイルは
20130123_gdbserver
DS-5の解説ページにはありませんが、リネーム対象はこのファイルの事です。
このファイルをndkに同梱されているものと置き換えます。スクリーンショットの様に元のファイルはgdbserver-orignalとでもして残しておきましょう。
20130123_change_gdbserver

DS-5がadb(Android Debug Bridge)を実行できるようにWindowsのシステム設定でパスを追加しておきます。これは各自の環境に応じて設定しましょう。
20130125_set_sdk_path

続いてデバッグコンフィグレーションの作成。
デバッグボタン右のメニューよりDebug Configurationsを選択し、DS-5デバッガに新しいコンフィグレーションを作成します。
20130125_create_debug_configuration

この設定は各アプリケーション毎に行うため、プロジェクト名_DS-5debugという名前を付けました。任意に分かりやすい名前を付けましょう。
事前にAVD(仮想端末)を立ち上げているのでスクリーンショットでは接続が認識されています。タブ(接続、ファイル、デバッグ、(x)引数と並んでいるもの)のアイコンに罰が付いているものが設定に不足がある項目です。
設定は赤丸ととおり、起動中のアプリケーションに接続するため、[Attach to a running Android application]を選択。
20130125_debug_debugsetting_connect_port

ファイルタブは赤丸で示したボタンからプロジェクトを選択すれば、全ての項目がオートコンプリートで設定されます。なお、先に書いたManifestファイルで、Debuggableをtrueにしていないと、プロセスの項目以下がオートコンプリートされず、設定を完了できないので注意してください。
20130125_create_debug_configuration02
事前に一度アプリケーションを実行しているのでapkファイルが作られているのでこうなっていますが、デフォルトの設定でBuildではapk作成がスキップされるようになっています。Buildでパッケージを生成されるようにするには[Window]>[Preferences]でSkip pakcagingのチェックを外す必要があります。普段はチェックを入れたままにして、必要に応じて設定しましょう。
こういうのがプロジェクトコンフィグレーションで分けられるとスッキリするのですが、まだまだ発展途上という事でしょう。

あとはデバッガタブの設定で実行制御を接続のみ、ソース検索ディレクトリパスを設定すればデバッグが開始できます。
20130125_debug_debugsetting

まずJavaコードレベルでJNIのファンクションがコールされる前にブレイクポイントを設定し、Android Applicationのコンフィグレーションでデバッグを開始しし
20130129_app_debug_start

ブレイクポイントで停止するのを待ちます。
20130129_app_brakepoint

つづいてDS-5のデバッガを起動します。
20130129_ds5_debug_start

デバッガの接続準備が始まり、
20130129_ds5_debug_connecting

各シンボル情報が読み込まれ、
20130129_ds5_debug_read_symbol

接続が完了してしばらく待つと、デバッグのツールボタンのContinueボタンがアニメーションを開始します。この状態になるとDS-5で、デバッグの操作が行えるようになります。
20130129_ds5_debug_brakepoint

この状態で、ソースコードや逆アセンブリリストからブレイクポイントの設定が可能となり、
20130129_ds5_debug_set_debugpoint

デバッグのツールボタンから各操作が可能になります。
20130125_ds5-debugging

デバッグを停止[Terminate(Ctrl+F2)]させたアプリケーションはRelaunchコマンドで再度実行することが出来ます。
20130131_ds5_debug_relaunch

DS-5の方はDisconnectしてConnect to Targetで再接続すると同様に再デバッグすることが出来ます。
20130131_ds5_debug_reconnect

実機でデバッグする際はroot権限を取得できる端末でない場合はデバッグを開始する際に設定を見直しましょう。
※AVD、実機の双方のデバッグに言えることですが、応答が無い状態でデバッグの設定やスレッドの操作などを行おうとすると、eclipseがフリーズする事が結構あるので注意しましょう。
フリーズした際はタスクマネージャからadb.exeを強制停止、Androidの方のタスクも強制停止する必要があります。

20130131_ds5_debug_realdevice

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください