【问题标题】:how can I debug an android native executable and library not directly integrated into the APK application如何调试未直接集成到 APK 应用程序中的 android 本机可执行文件和库
【发布时间】:2017-03-22 09:33:34
【问题描述】:

我有一个由基于 Java 的 APK、本机可执行文件和本机库组成的 android 应用程序。 apk 通过套接字与本机(根 NDK c/c++)可执行文件和库进行通信。

我不确定它是否重要,但可执行文件和库是通过 cmake 编译的,并复制为可执行文件,然后以 root 身份运行。我需要使用断点等进行某种类型的调试,无论它是直接在 android studio 中还是通过命令行。

【问题讨论】:

  • 只要你有native部分的源码并且可以在debug模式下编译,你可以用最新版本的Android Studio或者命令行lldb或gdb调试它。你有没有尝试过these instructions 之类的东西?
  • 我已经尝试过关注那些,但是我似乎找不到在我使用 ndk-build 时创建的 obj 目录。现在我正在使用 cmake,该目录似乎不存在。
  • 我对 Android 的 cmake 用法不是特别熟悉,但这一切都归结为找到带有未剥离符号的 .so 文件,只需寻找具有相同名称的更大 .so 文件
  • 所以我实际上是在尝试调试本机可执行文件,该可执行文件在应用启动时被复制并以 root 身份运行。该库被使用,所有通信都通过套接字完成。我已经添加了 .so 文件的路径,并按照您发布的链接中的所有步骤进行操作,但仍然无法使其中断。
  • Android Studio 能够附加和运行 java 应用程序 + 调试。所以他们使用。我不确定是否可以轻松地使用它来调试独立的非 Java 应用程序。你需要让它附加到设备上运行的 gdbserver,我可以给你说明如何进行命令行调试

标签: android c++ android-studio android-ndk native-executable


【解决方案1】:

您需要在设备上运行 gdbserver 并让它附加到您的可执行文件

gdbserver 自带 ndk,通常在<ndk>/prebuilt/android-arm/gdbserver/

  1. 将 gdbserver 二进制文件复制到您的设备,例如复制到 /data/local/tmp 并使用 chmod 为其授予可执行权限

  2. 如果您的可执行文件已经在运行,请使用ps 命令找到它的PID 并将gdb 附加到它:

    gdbserver :5039 --attach <PID>

请注意,5039 是端口号,通常用于 gdb 调试,您可以使用自己的端口号

  1. 设置从设备到电脑的端口转发

    adb forward tcp:5039 tcp:5039

  2. 在本地运行gdb,注意你也需要ndk自带的arm-targeted gdb,通常在

    <ndk>toolchains/arm-linux-androideabi-4.9/prebuilt/darwin-x86_64/bin/arm-linux-androideabi-gdb

  3. 将 gdb 附加到您的进程

    target remote :5039

从这里开始,您需要使用符合您的调试期望的 gdb 命令(设置断点、加载符号、单步执行等),例如使用 cheatsheet 或在 cmets 中询问

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多