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

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

0

该代码不是我创建的,也不在 Android 项目中,所以我不能使用 ndk-gdb 工具。

你的结论根本不成立。ndk-gdb应该能够调试任何 Android 程序,无论是作为“项目”还是通过其他方式创建的。

我在 android 机器上使用 gdbserver,并使用普通的 GDB 程序从我的 mac 连接到它。

普通的 GDB 可能没有配置为进行交叉调试,因此根本不理解 ARM 二进制文件。我很惊讶你能像你一样使用它。

于 2014-03-23T01:09:11.523 回答