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

我试图让NDKdebugging器工作,但迄今没有成功。

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

ndk-gdb脚本运行时遇到问题并启动GDB。 什么时候做一个“共享库”的命令,我得到这个:

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

但是,当我尝试中断执行或者例如添加段错误来testing时,我从来没有从调用堆栈中获得该库中的任何符号。 我得到的唯一的符号是从libc,如果我等待一个互斥体例如中断执行。 也尝试添加断点没有运气。 GDB允许我添加断点,并且代码运行良好,但断点从不触发。

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

您不需要使用-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中input以下命令
  6. set solib-search-path obj/local/armeabi
  7. file obj/local/armeabi/libMySharedLib.so
  8. target remote :5055

然后看看你是否可以debugging。

如果你想看到其他共享库的符号,你的库就像libc.so一样libc.so ,然后将它们从设备(从/system/lib文件夹) obj/local/armeabi你的obj/local/armeabi文件夹中。