android - 具有多个 so 库的 ndk-gdb

标签 android gdb android-ndk

我从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/

相关文章:

android - 可以从 Android 服务 onStartCommand() 调用 stopSelf() 吗?

java - 有没有什么方法可以让我们与生成 Intent 并从扩展 IntentService 类的类发送 Intent 的类进行通信?

android - Google Play 服务 9.2.0 选择性编译感知 API

c - Backtrace 指向 fopen 崩溃

linux - int 0x80 是否覆盖寄存器值?

c - DDD 替代方案,它也绘制了数据结构的漂亮图片

java - 如何将音频文件发送到android中的服务器?

android - GDBSERVER 启动时退出

java - 导入AOSP代码到IDEA/Intellij/Android Studio失败

android - UnsatisfiedLinkError In Android 4.4 libDevil cannot locate symbol "png_set_longjmp_fn"