我尝试使用 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
现在以最后一个库为例。当我检查文件命令(不在 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