【问题标题】:How to get ndk-gdb working on Android?如何让 ndk-gdb 在 Android 上运行?
【发布时间】:2012-05-19 01:08:00
【问题描述】:

我正在尝试让 NDK 调试器正常工作,但到目前为止没有成功。

为确保我的调试符号存在且有效,我使用编译器选项 -O0 和 -g,以及 ndk-build 参数 NDK_DEBUG=1。

ndk-gdb 脚本运行没有问题并启动 GDB。当执行“共享库”命令时,我得到这个:

Symbols already loaded for /bla/bla/libMySharedLib.so

但是,当我尝试中断执行或例如添加一个段错误来测试,我从来没有从调用堆栈中的那个库中得到任何符号。我得到的唯一符号来自 libc,例如,如果我在等待互斥锁时中断执行。还尝试添加断点但没有运气。 GDB 让我添加断点,代码运行良好,但断点从未触发。

我正在使用 API 级别 8,因为我需要支持 Android 2.2 (Froyo)。

【问题讨论】:

标签: android android-ndk gdb symbols


【解决方案1】:

您不需要使用 -O0 或 -g 开关。 您需要执行以下操作之一:

  1. android:debuggable="true" 放入AndroidManifest.xml 文件中的<application> 标记
  2. 在 ndk-build 之后使用 NDK_DEBUG=1
  3. APP_OPTIM := debug 放入Application.mk 文件中

执行这三件事中的任何一个都会自动使用 -O0 和 -g 开关。

您可以尝试手动运行 gdb,而不使用 gdb 脚本吗? 它涉及以下步骤:

  1. gdbserver 文件推送到设备上的/data/local 文件夹
  2. 运行您的应用程序并在 adb shell 中按照命令 gdbserver :5055 --attach PID 调用,其中 PID 是您的应用程序进程 ID。
  3. 在主机上运行 adb forward tcp:5055 tcp:5055
  4. 从您的应用文件夹运行 arm-linux-androideabi-gdb.exe
  5. 在 gdb 中输入以下命令
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

然后看看你是否可以调试。

如果您想查看您的库正在使用的其他共享库的符号,例如 libc.so,则将它们从设备(从 /system/lib 文件夹)拉到您的 obj/local/armeabi 文件夹。

【讨论】:

  • 由于一个不相关的原因,我不得不从头开始重新创建我的项目;在这样做并尝试按本书设置所有内容之后,包括您的建议 Mārtiņš,NDK 调试工作。不幸的是,我不确定问题出在哪里。顺便说一句,APP_OPTIM 必须设置为调试(小写)而不是调试。
  • [Re]使用 NDK_DEBUG=1 选项调用“ndk-build”进行构建;不是之后。
  • “ndk-build”在哪里?
  • ndk-build 是您调用以构建本机代码的命令。 ndk-build 脚本由 Android NDK 提供,位于 zip/tar.bz2 存档的根目录中。
  • 你如何“在设备上推送 gdbserver”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多