6

我正在尝试使用 Eclipse (Kepler) 在 Windows 上调试 NDK 项目,但 GDB 找不到 .so 文件的符号,因为搜索路径中的斜杠方向不正确。使用 NDK r9 和 SDK 22.2.1,当我尝试运行应用程序时,GDB 显示:

警告:无法加载 64 个库的共享库符号,例如 /system/bin/linker。

使用“info sharedlibrary”命令查看完整列表。

你需要“set solib-search-path”还是“set sysroot”?警告:无法找到动态链接器断点函数。

GDB 最终会重试。同时,GDB 很可能无法调试共享库初始化程序或在 dlopen() 之后解决挂起的断点。

没有加载符号表。使用“文件”命令。

没有加载符号表。使用“文件”命令。

没有加载符号表。使用“文件”命令。

对于我的库中设置的每个断点,“未加载符号表...”行出现一次。问题似乎是 GDB 没有找到未剥离的 .so 文件,因为搜索路径包含反斜杠而不是正斜杠。如果我暂停程序并执行以下 GDB 命令,这就是我得到的输出:

show solib-search-path

The search path for loading non-absolute shared library symbol files is C:\\Users\\Username\\Projects\\Project\\Android/obj/local/armeabi-v7a/.

info shared

From        To          Syms Read   Shared Object Library
0x4003fff0  0x4006db40  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libc.so
0x5bda8598  0x5bf5aa50  No          C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libProject.so

如果我然后更新 solib-search-path 以使用正斜杠,我会得到:

set solib-search-path C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/
warning: Could not load shared library symbols for 74 libraries, e.g. /system/bin/linker.
Use the "info sharedlibrary" command to see the complete listing.
Do you need "set solib-search-path" or "set sysroot"?
warning: Unable to find dynamic linker breakpoint function.
GDB will retry eventurally.  Meanwhile, it is likely
that GDB is unable to debug shared library initializers
or resolve pending breakpoints after dlopen().

info shared
From        To          Syms Read   Shared Object Library
0x4003fff0  0x4006db40  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libc.so
0x5bda8598  0x5bf5aa50  Yes         C:/Users/Username/Projects/Project/Android/obj/local/armeabi-v7a/libProject.so

之后,GDB 将成功地在本机代码中命中断点。libs\armeabi-v7a 文件夹中的 gdb.setup 文件包含以下行:

set solib-search-path ./obj/local/armeabi-v7a

但我不确定这条路径在哪里变成了绝对路径。我猜当时 GDB 使用带有反斜杠而不是正斜杠的路径,但我不确定发生在哪里。我确实尝试修改创建 gdb.setup 文件的 Android NDK 构建脚本,甚至尝试放入不同的路径,但是 show solib-search-path 的输出是一样的,所以我什至不确定 GDB 是使用该搜索路径。以前有没有人遇到过这个问题,或者有没有人知道当我从 Eclipse 运行时如何让 GDB 以正确的搜索路径启动?

4

1 回答 1

4

我认为这可能只是 GDB 直到稍后才加载符号。在加载项目的 .so 之前,我确实有延迟,以便让 GDB 有时间连接。我将延迟移到调用 loadLibrary 之后,现在它似乎可以很好地拾取符号。

于 2013-10-27T13:16:33.610 回答