【问题标题】:ndk-gdb with multiple so libs具有多个 so 库的 ndk-gdb
【发布时间】:2010-09-09 08:44:57
【问题描述】:

我从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 下?

以前有人遇到过这个问题吗?

非常感谢!

【问题讨论】:

    标签: android gdb android-ndk


    【解决方案1】:

    我认为您将它们复制到错误的文件夹中。较旧的 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 将找到这些符号。

    【讨论】:

    • 非常感谢您的回复!明天我会试试你的解决方案。而且,您能否提供更多关于 NDK 内部构建过程的文档?像“striped so”这样的东西,我从来没有听说过。
    • 查看 Unix 命令“strip”:unixhelp.ed.ac.uk/CGI/man-cgi?strip - 如果您在工作时在 Google 中输入“man strip”,请小心。对第一个链接感到惊讶。 :)
    • 至于构建过程的其他步骤,这在 NDK 包中的 docs/OVERVIEW.TXT 中有记录:“如果成功,最后一步将复制您的应用程序需要的剥离共享库到您的应用程序的根项目目录。”
    • 在 NDK 的 r5 中,您可以执行“ndk-build V=1”来获得详细输出,并且可以添加 --debug 以获得大量细节。在 5 中,输出到您项目的 libs/armeabi(或至少在我的安装中)。
    猜你喜欢
    • 2020-10-18
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 1970-01-01
    • 2012-10-27
    相关资源
    最近更新 更多