GBD を使用して Android のネイティブ コードをデバッグしようとしています。コードは私が作成したものではなく、Android プロジェクトにもないため、ndk-gdb ツールを使用できません。Androidマシンでgdbserverを使用し、通常のGDBプログラムを使用してMacから接続します。すべてのライブラリ (objdump ツールによるとシンボルがあるはずです) をロードしようとしましたが、gdb は (gdb コマンド「info sharedLibrary」によると) シンボルをロードしないと通知します。これらは私が取ったステップです:
- Android マシンで gdbserver を起動します
バイナリのデバッグ バージョンで GDB を起動します。
gdb symbols/system/bin/mediaserver
次のコマンドは gdb 自体で実行されます
シンボルを含むライブラリを探す場所を gdb に指示します
(gdb) set solib-search-path symbols/system/lib
ソースファイルの場所をgdbに伝える
(gdb) directory /sources
リモート ターゲット (Android マシン) に接続する
(gdb) target remote 192.168.1.10:5039
GDB は実行中のバイナリに正常に接続し、実行を一時停止して続行できます。ただし、関数名や行番号などのデバッグ情報は表示されません。住所しか表示されません。使用されているライブラリのステータスを確認すると、gdb がシンボルを持っていないと考えていることがわかります。
- 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