web-dev-qa-db-ja.com

Androidでndk-gdbを動作させる方法は?

NDKデバッガーを動作させようとしていますが、これまでのところ成功していません。

デバッグシンボルが存在し、有効であることを確認するには、コンパイラオプション-O0および-g、およびndk-buildパラメーターNDK_DEBUG = 1を使用します。

Ndk-gdbスクリプトは問題なく実行され、GDBを起動します。 「sharedlibrary」コマンドを実行すると、次のようになります。

Symbols already loaded for /bla/bla/libMySharedLib.so

ただし、実行を中断しようとすると、テストするためにセグメンテーション違反を追加すると、コールスタック内のそのライブラリからシンボルを取得できません。ミューテックスを待っている間に実行を中断した場合、取得したシンボルはlibcのみです。また、運のないブレークポイントを追加しようとしました。 GDBではブレークポイントを追加でき、コードは正常に実行されますが、ブレークポイントがトリガーされることはありません。

Android 2.2(Froyo)をサポートする必要があるため、APIレベル8を使用しています。

36
Simplex

-O0または-gスイッチを使用する必要はありません。次のいずれかを実行する必要があります。

  1. Android:debuggable="true"ファイルの<application>タグにAndroidManifest.xmlを配置します
  2. ndk-buildの後にNDK_DEBUG=1を使用します
  3. application.mkファイルにAPP_OPTIM := debugを配置

これら3つのことのいずれかを実行すると、-O0および-gスイッチが自動的に使用されます。

Gdbスクリプトなしでgdbを手動で実行してみてください。次の手順が含まれます。

  1. gdbserverファイルをデバイスの/data/localフォルダーにプッシュ
  2. アプリケーションを実行し、adb Shellを次のコマンドgdbserver :5055 --attach PIDで呼び出します。PIDはアプリケーションのプロセスIDです。
  3. ホストでadb forward tcp:5055 tcp:5055を実行しています
  4. アプリフォルダーからarm-linux-androideabi-gdb.exeを実行する
  5. gdbに次のコマンドを入力する
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

その後、デバッグできるかどうかを確認します。

ライブラリが使用している他の共有ライブラリのシンボルをlibc.soのように表示したい場合は、デバイスから(/system/libフォルダから)obj/local/armeabiフォルダにプルします。

66