【问题标题】:GDB does not load symbols from librariesGDB 不从库中加载符号
【发布时间】:2014-03-22 23:34:26
【问题描述】:

我尝试使用 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

【问题讨论】:

    标签: c android-ndk gdb gdbserver


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的快速回复。据我所知,您必须从项目的项目文件夹中启动 ndk-gdb,以便我找到它需要运行的所有文件和设置。或者你知道如何手动配置ndk-gdb?
    • 也许我能做到这一点的原因是,我使用了来自 Android NDK 的 gdb 二进制文件之一(但不是 ndk-gdb)。所以这个二进制文件可能已经为 arm 架构正确配置了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2014-06-06
    • 1970-01-01
    相关资源
    最近更新 更多