NDK には、コマンドラインのネイティブ デバッグ セッション(以前は gdb、現在は lldb)を開始するための ndk-gdb というシェル スクリプトが含まれています。GUI を使用するユーザーは、代わりに Android Studio でのデバッグに関するドキュメントをご覧になるようおすすめします。
要件
コマンドラインのネイティブ デバッグを使用するには、次の要件を満たす必要があります。
- アプリを
ndk-buildスクリプトを使用してビルドすること。ndk-gdbスクリプトでは、以前のmake APP=<name>メソッドを使ったビルドがサポートされていません。 AndroidManifest.xmlファイルでのアプリのデバッグを有効にする際、android:debuggable属性をtrueに設定する<application>要素を含めること。- Android 2.2(Android API レベル 8)以上で実行するアプリをビルドすること。
- Android 2.2 以上を稼働するデバイスまたはエミュレータでデバッグすること。
デバッグは
AndroidManifest.xmlファイルで宣言するターゲット API レベルにかかわりなく行われます。 - アプリを Unix シェルで開発すること。Windows では、Cygwin を使用するか、Python 実装の
ndk-gdb-py(試験運用版)を使用します。 - GNU Make 3.81 以上を使用すること。
用途
アプリのディレクトリまたはその下のディレクトリに移動して、ndk-gdb スクリプトを呼び出します。次に例を示します。
cd $PROJECT $NDK/ndk-gdb
ここで、$PROJECT はプロジェクトのルート ディレクトリを指し、$NDK は NDK のインストール パスを指します。
ndk-gdb を呼び出すと、ソースファイルと、生成されたネイティブ ライブラリのシンボル / デバッグ バージョンを検索するセッションが設定されます。アプリのプロセスに正常にアタッチすると、連続する長いエラー メッセージが ndk-gdb から出力され、さまざまなシステム ライブラリが見つからないことを警告します。ホストマシンには対象デバイスのシステム ライブラリのシンボル / デバッグ バージョンが含まれないため、これは正常な動作です。こうしたメッセージは無視してかまいません。
次に、ndk-gdb は通常の lldb プロンプトを表示します。
ndk-gdb は lldb と同じ方法で操作します。lldb に慣れていないが gdb に精通している場合は、[GDB から LLDB へのコマンドマップ](https://lldb.llvm.org/use/map.html) をご覧ください。
ndk-gdb は多くのエラー条件を処理し、問題を発見するとその情報を伝えるエラー メッセージを表示します。こうしたチェックでは、次の条件を満たすかどうかも確認されます。
- ADB がパスにある。
- マニフェストでアプリケーションがデバッグ可能であると宣言されている。
- デバイス上の同じパッケージ名を持つインストール済みのアプリもデバッグ可能である。
デフォルトで、ndk-gdb によりすでに実行中のアプリのプロセスが検索され、見つからない場合はエラーが表示されます。ただし、--start オプションまたは --launch=<name> オプションを使用すると、デバッグ セッションの前にアクティビティを自動的に開始できます。詳細については、オプションの説明をご覧ください。
オプション
すべてのオプションのリストを表示するには、コマンドラインで「ndk-gdb --help」と入力します。表 1 に一般的に使用されるいくつかのオプションとその簡単な説明を示します。
表 1. 一般的な ndk-gdb オプションとその説明
このオプションを指定して ndk-gdb を開始すると、アプリのマニフェストにある最初の起動可能なアクティビティが起動します。次の起動可能なアクティビティを開始するには、--launch=<name> を使用します。起動可能なアクティビティのリストを出力するには、コマンドラインから --launch-list を実行します。
| 設定 | 説明 |
|---|---|
--verbose |
このオプションは、ネイティブ デバッグ セッションの設定に関する詳細情報を出力するようにビルドシステムに通知します。このオプションを使用する必要があるのは、デバッグに問題がある場合のみです(デバッガがアプリに接続できない、 |
--force |
デフォルトで(このオプションを指定しない場合)、同じデバイスで別のネイティブ デバッグ セッションがすでに実行されていれば、ndk-gdb は中止されます。このオプションは他のセッションを強制終了して、新しいセッションに置き換えます。
このオプションを指定しても、デバッグ中のアプリは強制終了されないことにご注意ください。デバッグ中のアプリは別途強制終了する必要があります。 |
--start |
デフォルトで、 |
--launch=<name> |
このオプションは、アプリから特定のアクティビティを開始できることを除いては、 |
--launch-list |
この便利なオプションは、アプリ マニフェストで見つかったすべての起動可能なアクティビティ名のリストを出力します。 |
--project=<path> |
このオプションは、アプリのプロジェクト ディレクトリを指定します。このオプションを使用すると、スクリプトを起動する前にプロジェクト ディレクトリに移動する必要がなくなるため便利です。 |
--port=<port> |
デフォルトで、 |
--adb=<file> |
このオプションは、adb ツールの実行可能ファイルを指定します。この実行可能ファイルのインクルード パスを設定していない場合にのみ、このオプションが必要です。 |
-d-e-s <serial> |
これらのフラグは、同じ名前の adb コマンドと同様に機能します。複数のデバイスがある場合、またはホストマシンに接続しているエミュレータが複数ある場合は、これらのフラグを設定します。これらのフラグの意味は次のとおりです。
特定のオプションを使用せずに、 |
--exec=<file>-x <file> |
このオプションは、デバッグ中のプロセスに接続した後、 |
--nowait |
デバッガが接続するまで Java コードを一時停止する機能を無効にします。このオプションを渡すと、デバッガが初期のブレークポイントを見落とすことがあります。 |
--tui
-t |
テキスト ユーザー インターフェースが利用できる場合は、そのインターフェースを有効にします。 |
--gnumake-flag=<flag> |
このオプションは、プロジェクト情報をクエリするときに |
注: この表の最後の 3 つのオプションを使用できるのは、ndk-gdb の Python バージョンのみです。