1

GBD を使用して Android のネイティブ コードをデバッグしようとしています。コードは私が作成したものではなく、Android プロジェクトにもないため、ndk-gdb ツールを使用できません。Androidマシンでgdbserverを使用し、通常のGDBプログラムを使用してMacから接続します。すべてのライブラリ (objdump ツールによるとシンボルがあるはずです) をロードしようとしましたが、gdb は (gdb コマンド「info sharedLibrary」によると) シンボルをロードしないと通知します。これらは私が取ったステップです:

  1. Android マシンで gdbserver を起動します
  2. バイナリのデバッグ バージョンで GDB を起動します。

    gdb symbols/system/bin/mediaserver

次のコマンドは gdb 自体で実行されます

  1. シンボルを含むライブラリを探す場所を gdb に指示します

    (gdb) set solib-search-path symbols/system/lib

  2. ソースファイルの場所をgdbに伝える

    (gdb) directory /sources

  3. リモート ターゲット (Android マシン) に接続する

    (gdb) target remote 192.168.1.10:5039

GDB は実行中のバイナリに正常に接続し、実行を一時停止して続行できます。ただし、関数名や行番号などのデバッグ情報は表示されません。住所しか表示されません。使用されているライブラリのステータスを確認すると、gdb がシンボルを持っていないと考えていることがわかります。

  1. gdb のコマンド:

(gdb) info sharedLibrary From To Syms Read Shared Object Library 0x00003700 0x0000ff0c Yes /symbols/system/bin/linker No libc.so No libstdc++.so No libm.so No liblog.so No libcutils.so No libspeexresampler.so No libaudioutils.so No libgccdemangle.so No libamplayer.so

たとえば、最後のライブラリです。file コマンド (gdb ではありません) で確認すると、ストリップされていないライブラリであることがわかります (ライブラリは "symbols/system/lib" フォルダーにあります)。

file libamplayer.so

出力:

libamplayer.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped

objdump コマンドは、その中に多くのシンボルを表示します (非常に長いため、出力は表示しません)。では、なぜ gdb はこのライブラリのシンボルを認識しないのでしょうか? 少なくとも行番号と関数名は、削除されていないバージョンのライブラリに存在すると思いました。それとも私が間違っていますか?誰かが私にもっと洞察を与えることができれば、とてもうれしいです。

ありがとう!

システム情報:

GDB バージョン: Mac OS X Mavericks の 7.3.1-gg2

4

1 に答える 1