我正在尝试使用Eclipse(Kepler)在Windows上调试NDK项目,但是GDB将找不到.so文件的符号,因为搜索路径中的斜杠方向不正确。使用NDK r9和SDK 22.2.1,当我尝试运行应用程序时,GDB显示:
警告:无法加载64个库的共享库符号,例如/系统/ bin中/接头。
使用“info sharedlibrary”命令查看完整列表。
您需要“set solib-search-path”还是“set sysroot”? 警告:无法找到动态链接器断点函数。
GDB将重新进行重试。同时,在dlopen()之后,GDB很可能无法调试共享库初始化程序或解决挂起的断点。
未加载符号表。使用“file”命令。
未加载符号表。使用“file”命令。
未加载符号表。使用“file”命令。
对于我的库中设置的每个断点,“无符号表已加载...”行显示一次。问题似乎是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启动正确的搜索路径?
答案 0 :(得分:4)
我认为这可能只是GDB没有加载符号直到以后。在加载项目的.so之前我确实有一个延迟,以允许GDB时间连接。我将延迟移动到调用loadLibrary之后,现在它似乎正好接收符号。