Android アプリケーションには、メイン アプリケーション プロセスとリモート サービス プロセスの 2 つのプロセスがあります。ネイティブ ライブラリは、リモート サービス プロセスからロードされます。
ネイティブ ライブラリ コードをデバッグしたい。アプリケーションはデバッグ可能です。ネイティブ ライブラリは、ndk-build を使用して Windows コマンドラインからビルドされました。Android.mk では、このライブラリに -g -ggdb フラグが使用されていました。Cygwin から ndk-gdb を実行しています。
テストデバイス: Android 4.2.2 を実行する Galaxy Nexus
エラー行: 共有ライブラリの読み込み中にエラーが発生しました: ?: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません
詳細情報では、gdbserver がメイン アプリケーション プロセスのプロセス ID にアタッチしようとしていることがわかります。ライブラリがこのアプリケーション内のリモート プロセスから読み込まれることが重要です。
詳細な ndk-gdb 実行情報- $ ndk-gdb --verbose --force
Android NDK インストール パス: /cygdrive/c/work/android/ndk/android-ndk-r9-windows-x86/android-ndk-r9
Using default adb コマンド: /cygdrive/c/work/android/sdk/android-sdk_r10-windows/android-sdk-windows/platform-tools/adb
見つかった ADB バージョン: Android Debug Bridge バージョン 1.0.31
ADB フラグの
使用: JDB コマンドの使用: /cygdrive/c/program files (x86)/java/jdk1.6.0_25/bin/jdb
自動検出されたプロジェクト パスを使用: .
見つかったパッケージ名: [application-pkg-name]
アプリケーションが対象とする ABI: armeabi
デバイス API レベル: 17
デバイス CPU ABI: armeabi-v7a armeabi
互換性のあるデバイス ABI: armeabi
gdb セットアップ init を使用: ./libs/armeabi/gdb.setup
ツールチェーン プレフィックスを使用: /cygdrive/c/work/android/ndk/android-ndk-r9-windows-x86/android-ndk-r9/toolchains/arm-linux -androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-
アプリ出力ディレクトリの使用: ./obj/local/armeabi 検出
されたデバッグ可能フラグ: true
検出されたデバイス gdbserver: /data/data/[applcation-pkg-name] /lib/gdbserver 検出
されたデータ ディレクトリ: '/data/data/[applcation-pkg-name]'
実行中の PID が検出されました: 17890
gdbserver が正常に起動されました。
ネットワークリダイレクトのセットアップ
## コマンド: adb_cmd shell run-as [applcation-pkg-name] lib/gdbserver +debug-socket --attach 17890
## コマンド: adb_cmd forward tcp:5039 localfilesystem:/data/data/[applcation-pkg-name]/debug-socket Attached; pid = 17890 [コメント: この pid はメイン アプリケーション プロセス用です]
Unix ソケットをリッスンする debug-socket
## COMMAND: adb_cmd pull /system/bin/app_process obj/local/armeabi/app_process
493 KB/s (0.019 で 9592 バイト) s)
デバイス/エミュレーターから app_process をプルしました。
## コマンド: adb_cmd pull /system/bin/linker obj/local/armeabi/linker
1165 KB/s (0.053 秒で 63244 バイト)
デバイス/エミュレーターからリンカーをプルしました。
## コマンド: adb_cmd pull /system/lib/libc.so obj/local/armeabi/libc.so
2442 KB/s (0.119 秒で 297608 バイト)
デバイス/エミュレーターから libc.so をプルしました。
/cygdrive/c/work/android/ndk/android-ndk-r9-windows-x86/android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/windows/bin/arm-linux-androideabi-gdb .exe: 共有ライブラリの読み込み中にエラーが発生しました: ?: 共有オブジェクト ファイルを開けません: そのようなファイルまたはディレクトリはありません
役立つ可能性のあるいくつかの補足事項-
1) --force を指定せずに ndk-gdb コマンドを実行すると、別のデバッグ セッションが実行されているというエラーが表示されます。前回の実行中に gdb プロンプトが出ましたが。2) Android 4.3 で、同じアプリケーションとセットアップを使用すると、「パッケージのデータ ディレクトリを抽出できませんでした」というエラーが表示されます。