Happy My Life

日常とか技術とか

NDKなコードでデバッガが使えるように

ようやく、ようやく、ADTr20になってC/C++のコードがデバッガを使ってデバッグができるようになった(これ以下、NDKデバッグ機能と呼ぶ)

これまでもgdb(GNU Debugger)を使ったデバッグができていたけど使い勝手的に難易度高い訳で。ようやくEcliseをつかってデバッグができるようになったのはかなりうれしい。

ということで、設定からデバッグまでの手順をメモしておく。

インストール

最初にADTr20を新規にインストールする。これはNDKデバッグ機能に必要なプラグイン(NDK plugins)は、ADTr18からのアップグレードではインストールされないから。ADTr18を削除して、ADTr20を新規にインストールした方が早い。

ADTr20だとインストールされるプラグインはこんな感じ。

ndk-debug-1

NDKデバッグ機能は、CDT(EclipseC/C++開発環境向けプラグイン)の機能に依存しており動作はCDTが必要なのだがADTをインストールすると勝手にCDTもインストールされるので、別途インストールは不要。

設定

NDKのインストール場所を設定する必要がある。Preferences > Android > NDKにて設定する

ndk-debug-2

ビルド

NDKを利用したプロジェクトをデバッグする前に、C/C++のコードをデバッグ指定(NDK_DEBUG=1)してビルドする。

% ndk-build NDK_DEBUG=1

実行(デバッグ手順)

デバッグする際は、Debug as > Android Native Applicationを指定して実行する。

ndk-debug-3

で、あとはデバッグができる(変数の値、レジスタの値を見ることも可能)。動作中のコードに、ポンとBreakpointを仕掛けても指定した場所を実行する場合に止まってくれるので、気軽にデバッガが使える。

ndk-debug-4

Javaを利用した際のデバッグだが、JavaのコードからJNIのコードへのシームレスにトレースするのはまだ大変な感じ。Debug As > Android Applicationで実行して、JavaのコードでいったんBreakpointで止めてから、しつこくStep Intoしていけば、最終的にCのコードにたどり着くことは可能。ただ、そこからCのコードにBreakpointを仕掛けて止める、といったことはまだできない。いつかはできるようになるんだけど。

とはいえ、NDKでデバッガできるようになったことは喜ばしいことなので、これからバンバンと活用していきたい。