我尝试使用GBD在Android上调试一些本机代码。代码不是由我创建的,不在Android项目中,因此我无法使用ndk-gdb工具。我在android机器上使用gdbserver并使用普通的GDB程序从我的mac连接到它。我尝试加载所有库(根据objdump工具应该有符号),但gdb告诉我它不加载符号(根据gdb命令“info sharedLibrary”)。这些是我采取的步骤:
使用二进制文件的调试版本
启动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) 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
答案 0 :(得分:0)
代码不是由我创建的,不在Android项目中,因此我无法使用ndk-gdb工具。
你的结论根本没有。 ndk-gdb
应该能够调试任何Android程序,无论是否创建为"项目"或通过其他方式。
我在android机器上使用gdbserver,并使用普通的GDB程序从我的mac连接到它。
正常的GDB可能未配置为进行交叉调试,因此无法理解所有的ARM二进制文件。我很惊讶你能像你一样使用它。