如何在Android上使ndk-gdb工作?

39

我正在尝试让NDK调试器正常工作,但是迄今为止没有成功。

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

ndk-gdb脚本可以正常运行并启动GDB。当我执行“sharedlibrary”命令时,我会得到以下结果:

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

然而,当我尝试中断执行或添加段错误以进行测试时,调用堆栈中从该库获取的符号从未出现。如果例如在等待互斥锁时中断执行,则我得到的唯一符号来自libc。我还尝试添加断点,但没有成功。虽然GDB允许我添加断点且代码正常运行,但这些断点从未触发。

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


报告称他们的文档在 https://issuetracker.google.com/issues/69223567 上无法使用,文档链接为 https://developer.android.com/ndk/guides/ndk-gdb.html ,出现了 P999 :-)。 - Ciro Santilli OurBigBook.com
1个回答

73
您不需要使用 -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 中输入以下命令:
    1. set solib-search-path obj/local/armeabi
    2. file obj/local/armeabi/libMySharedLib.so
    3. target remote :5055
然后看一下是否可以进行调试。
如果您想查看您的库正在使用的其他共享库(如 libc.so)的符号,则将它们从设备中(从 /system/lib 文件夹中)拉到您的 obj/local/armeabi 文件夹中。

1
由于某些原因,我不得不从头开始重新创建我的项目。在这样做并尝试按照书本上的方法设置一切(包括你Mārtiņš的建议)之后,NDK调试起作用了。很遗憾我不确定具体是什么问题。顺带一提,APP_OPTIM必须设置为debug(小写),而不是Debug。 - Simplex
只有在您已经获取了 root 权限的设备上,第二步才可行。如果您的设备没有 root 权限,则需要使用 adb shell run-as 命令,请参见:http://ian-ni-lewis.blogspot.com/2011/05/ndk-debugging-without-root-access.html。 - Peter Tran
这个答案非常有帮助,但实际问题是另外一件事:NDK 的 GDB 在那个时候不支持调试主线程以外的线程。然而,看起来这在较新的 NDK 版本中得到了支持。 - Simplex
2
你如何在设备上“推送gdbserver”? - revolutionary
使用 adb push <local> <remote> 或将文件复制到例如 /sdcard 空间,然后通过 adb shell 手动移动它(因为文件不能直接从 SD 卡执行)。 - Yirkha
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接