3

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

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

4

1 回答 1

2

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

gdbserver 是用 ndk 预构建的,通常在<ndk>/prebuilt/android-arm/gdbserver/

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

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

    gdbserver :5039 --attach <PID>

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

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

    adb forward tcp:5039 tcp:5039

  2. 在本地运行 gdb,注意你还需要 ndk 附带的 arm 目标 gdb,通常在

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

  3. 将 gdb 附加到您的进程

    target remote :5039

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

于 2016-11-09T22:23:18.550 回答