GDB不会从库中加载符号

时间:2014-03-22 23:34:27

标签: c android-ndk gdb gdbserver

我尝试使用GBD在Android上调试一些本机代码。代码不是由我创建的,不在Android项目中,因此我无法使用ndk-gdb工具。我在android机器上使用gdbserver并使用普通的GDB程序从我的mac连接到它。我尝试加载所有库(根据objdump工具应该有符号),但gdb告诉我它不加载符号(根据gdb命令“info sharedLibrary”)。这些是我采取的步骤:

  1. 在Android机器上启动gdbserver
  2. 使用二进制文件的调试版本

    启动GDB

    gdb symbols/system/bin/mediaserver

  3. 以下命令在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

    4. GDB成功连接到正在运行的二进制文件,我可以暂停并继续执行。但它没有显示任何调试信息,如函数名称或行号。它只显示地址。当我检查使用过的库的状态时,我看到gdb认为,它们没有任何符号:

        gdb中的
      1. 命令:
      2. (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

1 个答案:

答案 0 :(得分:0)

  

代码不是由我创建的,不在Android项目中,因此我无法使用ndk-gdb工具。

你的结论根本没有。 ndk-gdb应该能够调试任何Android程序,无论是否创建为"项目"或通过其他方式。

  

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

正常的GDB可能配置为进行交叉调试,因此无法理解所有的ARM二进制文件。我很惊讶你能像你一样使用它。