我正在尝试使用 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 以正确的搜索路径启动?