39

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

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

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

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

ただし、実行を中断したり、テストに segfault を追加したりすると、呼び出しスタックでそのライブラリからシンボルを取得できません。たとえば、ミューテックスを待っている間に実行を中断した場合、取得した唯一のシンボルはlibcからのものです。また、運の悪いブレークポイントを追加しようとしました。GDB ではブレークポイントを追加でき、コードは正常に実行されますが、ブレークポイントがトリガーされることはありません。

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

4

1 に答える 1

72

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

  1. ファイル内android:debuggable="true"<application>タグに入れるAndroidManifest.xml
  2. NDK_DEBUG=1ndk-build の後に使用
  3. APP_OPTIM := debugApplication.mk ファイルに入れる

これら 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/libobj/local/armeabi

于 2012-05-10T18:13:09.120 に答える