我从Android NDK r4 了解到“ndk-gdb”调试工具。现在我可以开始调试 hello-jni 示例(尽管存在一些问题)。
但是,对于我自己的 Android 应用程序,我有几个 so 库可以使用,它们是从大量的 c/c++ 文件构建的。我以前用ndk-build构建这些so文件,然后把这些so文件复制到$PROJECT/libs目录下,不用调试也能正常运行。但是现在我想用ndk-gdb调试一个so lib。当我启动 ndk-gdb 时,它提示没有加载符号表。
我还将所有这些 so 文件复制到 $PROJECT/bin/ndk/local/armeabi(似乎是 gdb 尝试加载符号表的默认目录)。而且,它仍然不起作用。
也许我复制后 ndk-gdb 无法跟踪我的 so 文件?或者为什么它无法加载任何符号表,即使我将它们复制到 $PROJECT/bin/ndk/local/armeabi 下?
以前有人遇到过这个问题吗?
非常感谢!
最佳答案
我认为您将它们复制到了错误的文件夹中。较旧的 NDK 将文件复制到 bin 文件夹;新的将它们复制到 obj 文件夹,这就是它指向 gdb 查找符号的地方。
此外,请确保将预先剥离的 .so 文件复制到 obj 文件夹,而不是复制到 libs 文件夹的相同文件:作为构建过程的一部分,libs 文件夹中的文件已被剥离符号和调试信息。因此,您需要为每个 .so 文件保留两份副本:一份来自 libs 文件夹以安装在 Android 设备上,另一个来自 obj 文件夹以供 GDB 安装以从中获取符号。
您可以不将调试文件复制到应用树中的 obj 文件夹,而是将其他构建目录 obj/文件夹添加到 gdb 的符号搜索路径。 ndk-build 会设置一个文件 gdb.setup,其中包含以 set solib-search-path 开头的行。您可以在包含所有目标 obj/local/whatever 文件夹的该行上放置一个以冒号分隔的路径,然后 gdb 将找到这些符号。
关于android - 具有多个 so 库的 ndk-gdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3675045/