前提:保证NDK环境建立ok,可参考文章“Windwos下Android NDK开发环境搭建“
若想在设备上使用,必须取得root权限才可。
注意在/home/用户/.bash_profile中环境变量的配置:
以上配置是为保证编译,调试过程能正确使用相关命令。
接下来以调试android ndk下samples中的hello-jni为例,来阐述调试过程。
由于:
The new NDK has a Windows version of ndk-build, but ndk-gdb is still a
bash script. This doesn't only mean that you need Cygwin to run it, it
also means that everything written in ndk-gdb is written from a Linux
standpoint.
所以,在windows下要用ndk-gdb的话,我们必须安装Cygwin.
如果在Windwos下运行ndk-gdb的话,将会出现如下问题。
值得注意的是,我们还必须在Cygwin中,配置ANDROID_NDK_ROOT这个环境变量,配置方法参见”Windwos下Android NDK开发环境搭建“中所描述。
否则在使用ndk-build会出现如下问题:
awk fatal:Can't open source file ‘/cygdrive/d/android-ndk-r5c/samples/hello-jni/ D:\android-ndk-r5c/build/awk/check-awk.awk' for reading (no such file or directory)
Error:Could not run 'awk' command.Do you have it install properly?
解决方法来自:https://groups.google.com/forum/#!msg/android-ndk/_4JNdY_h558/vdzP-4CkQrUJ
接下来,将按照如下步骤来调试。
1、启动Cygwin Terminal.
2、进入hello-jni的Android工程目录
$ cd $ANDROID_NDK_ROOT/samples/hello-jni
3、以调试模式构建c/c++程序,目的是生成共享库,.so文件
$ ndk-build NDK_DEBUG=1
这里我们使用 ndk-build NDK_DEBUG=1 生成带符号表的 .so
或者修改AndroidManifest.xml,设置android:debuggable=true。
注意:从上面执行的结果可看到,除了得到编译的动态共享库,还有Gdbserver和Gdbsetup。如果不是设置为调试模式不会产生这两个文件。
4、生成build.xml文件(用于用ant打包生成apk,见下面的步骤5)
$ android update project -p . -t android-18 (在cygwin下,$ android.bat update project -p . -t android-18)
5、$ ant debug install
注1:如果在构建过程中出现如下错误:
[aapt] invalid resource directory name: C:\Users\Paul\git\XXXXXXXX\bin\res/crunch 在网上找到如下的解决方法:
本人是通过执行“ant clean debug install”来解决以上错误的。
注2:如果没构建的工程,涉及到库工程。则在构建过程中可能会出现类似如下错误:
则需在库工程目录下,为库工程执行“ android.bat update project -p . -t android-18”来生成需要的build.xml文件。
6、启动应用程序的ndk-gdb调试。
如果你要调试的程序没有运行,需使用ndk-gdb --start。
如果你要调试的程序已经在运行了,直接运行ndk-gdb。
$ ndk-gdb --start
这时会启动应用,接着就可以使用gdb的命令了。
7、用list或l命令查看C文件的内容.
(gdb) list
可以用list 1,100 或 l 1,100来指定显示源文件的范围。 如果遇到No symbol table is loaded. Use the "file" command.则需使用以下命令加载需要调试的so文件:
8、用break 或 b命令设定断点 (gdb) break 30 //将断点设置在30行
9、查看断点信息
(gdb) info breakpoints
10、使用c或者continue命令继续运行程序。
(gdb) continue
11、 按返回键再手动重启应用(触发程序运行在断点处),就会停在30行断点处了。(注意:如果停止了应用程序是不行的)
12、为了使程序继续运行下去,执行continue命令。
注:在调试其他native程序时,如果在第10步出现错误:
Continuing.
错误原因:使用ndk-gdb --start 启动程序第一个activity,但是此时so文件并没有被加载。
解决方法:首先打开程序并使用,在保证so文件已经被使用的情况下,调用ndk-gdb命令调试程序进程。