我试图让NDK调试工作,但没有成功为止。
为了确保我调试符号存在和有效,我使用编译器选项-O0和-g和NDK的建造参数NDK_DEBUG = 1。
NDK的-gdb的脚本出来的问题和运行启动GDB。 如果做一个“sharedlibrary”命令,我得到这样的:
Symbols already loaded for /bla/bla/libMySharedLib.so
然而,当我试着将执行或如添加段错误进行测试,我从来没有从调用堆栈库得到任何符号。 我已经得到的唯一符号是从libc的,如果我打破执行,同时它的等待,例如互斥。 也试过,没有运气添加断点。 GDB让我增加了断点,代码运行良好,但断点永远不会触发。
我使用API级8,因为我需要支持Android 2.2(升级Froyo)。
你并不需要使用-O0或-g开关。 你需要做以下之一:
- 放
android:debuggable="true"
的<application>
在标签AndroidManifest.xml
文件 - 使用
NDK_DEBUG=1
NDK-生成后 - 把
APP_OPTIM := debug
中Application.mk文件
这三样东西做的人会自动用-O0和-g开关。
你可以尝试手动运行GDB,没有GDB脚本? 它包括以下步骤:
- 推动
gdbserver
文件/data/local
设备上的文件夹 - 在运行应用程序和在调用
adb shell
下面的命令gdbserver :5055 --attach PID
,其中PID是应用程序的进程ID。 - 运行
adb forward tcp:5055 tcp:5055
主机 - 运行
arm-linux-androideabi-gdb.exe
从您的app文件夹 - 进入在gdb下面的命令
-
set solib-search-path obj/local/armeabi
-
file obj/local/armeabi/libMySharedLib.so
-
target remote :5055
看看你是否可以调试即可。
如果你想看到你的库是用像其他共享库中的符号libc.so
,然后将它们从设备(从/system/lib
文件夹)到您的obj/local/armeabi
文件夹中。