39

我试图让 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)。

4

1 回答 1

72

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

  1. 放入文件android:debuggable="true"中的<application>标签AndroidManifest.xml
  2. NDK_DEBUG=1在 ndk-build 之后使用
  3. 放入APP_OPTIM := debugApplication.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文件夹。

于 2012-05-10T18:13:09.120 回答