程序调试方法
方法一 LOG 打印
打印输出是最常用的方法。加入打印功能,牵涉到修改两个文件,一个是adroid.mk,还有就是用到LOG的C/C++源代码。
修改地方一
在编辑的源码文件中加入
#include<string.h>
#include<jni.h>
#include<android/log.h>
修改地方二
在android.mk文件中修改编译选项加入 llog
在eclipse下会自动提示错误,可能会在头文件旁出现提示说 “ can not resolve the file”, 意思是找不到这个头文件,而头文件明明在目录下存在。
这个时候工程右键-> add native support 可解决。
方法二 NDK环境下单步调试
NDK-GDB的调试方法很不完善,在使用过程中会有各种问题,不推荐使用,在这里记录使用过程中遇到的一些问题解决方法。
1)如果没有安装ant
从 http://ant.apache.org/bindownload.cgi 下载安装。
设置好环境变量后进入windows命令行,测试ant命令输入 ant -version
解决方法:将“C:\ProgramFiles\Java\jdk1.6.0_16\lib”目录下的tools.jar文件拷贝到“C:\Program Files\Java\jre6\lib”目录下,重新运行命令ant,运行正常,问题解决。
使用步骤:
1、以调试模式构建c/c++程序,目的是生成带调试符号的可运行程序
$ ndk-buildNDK_DEBUG=1
2、生成build.xml文件(用于用ant打包生成apk,见下面的步骤5)
$ android updateproject -p . -t android-18 (在cygwin下,$ android.bat update project -p . -tandroid-18)
3、$ ant debug install
可能出现的问题
问题一、 运行ant 出现如下错误:
BUILD FAILED
F:android-sdk-windows oolsantbuild.xml:653:The followingerror occurred while executing this line:
F:android-sdk-windows oolsantbuild.xml:698:null returned:1
解决方法:清除bin目录下的所有文件,如果是在eclipse里面clean一下当前项目即可
$ ../../ndk-gdb --start
../../ndk-gdb: line 764: /cygdrive/c/Program: No such file or directory
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
因为JDK路径有空格 装在了Program File
../../ndk-gdb--start –verbose 看到更详细的信息
问题二、 出现问题现象:
Unableto detect application ABI's
Android NDK: WARNING: APP_PLATFORM android-9 is largerthan android:minSdkVersion 8 in/home/wiseideal/workspace/NdkShots/AndroidManifest.xml
解决方法:在AndroidManifest.xml中设置min到9
一次完整的调试,参考 android ndkC++高级编程。
在 hello-jni工程中增加一个按钮。而后验证了,不加此按钮看不到调试效果。可见 ndk-gdb还是很不成熟。
方法三 Linux环境下的gdb调试
如果用手机调试首先确保能够获取当前Android系统的Root权限,这个可以通过百度一键Root工具实现(bdyjroot.apk),安装后使用此应用获取到Root权限,然后安装adbd-Insecure-v1.30.apk应用(能让您在已经ROOT的设备上强制以ROOT模式运行adbd)。
步骤一
在调试之前,需要在eclipse新建一调试配置,选择xxx_工程,点击工具栏的debug按钮在弹出的debug configurations对话框中双击左边的c/c++Remote application,将在其下出现sp2Default:
在右边选择main选项卡,c/c++ application通过点击browse..按钮选择[工作空间]\sp2\src\execute\Debug\qqtest_shared文件。注意要选debug目录下的,否则文件被strip后,它包含的符号信息被删掉会导致调试不成功。
在右边选择debuger选项卡,选择main子选项卡,GDB debuger通过browse..按钮选择
Tools\arm-none-linux-gnueabi-gdb.exe文件,GDB command file为空即可。
选择Shared Libraries选项,添加工程使用的动态库所在目录。这里也要选带调试信息的库。
Stop on startup at 选择main可以使得程序在入口函数main处暂停
选择connection子选项卡,type选择tcp,host name or ip address 为localhost,port number为10000。最后点击apply按钮保存配置。
步骤一 将工程生成的库文件,依赖的库,可执行程序(test),gdbserver发送到板上的文件系统。
在本例中,可执行程序为qqtest_shared
cd /data/local
tftp -gr qqtest_shared 10.1.53.39
tftp -gr libhello.so 10.1.53.39
tftp -gr libm.so.6 10.1.53.39
tftp -gr libpthread.so.0 10.1.53.39
tftp -gr librt.so.1 10.1.53.39
tftp -gr libstdc++.so.6 10.1.53.39
tftp -gr ld-linux.so.3 10.1.53.39
tftp -gr libdl.so.2 10.1.53.39
tftp -gr libc.so.6 10.1.53.39
tftp -gr libgcc_s.so.1 10.1.53.39
//这里是通过tftp下载,也可通过adb push下载
依赖的库是否下载完全,通过运行./ qqtest_shared看能否正常运行。
步骤二
打开windows命令行(run->cmd.exe)
adb disconnect
adb connect 10.1.53.51 //10.1.53.51为开发板的IP
adb push gdbserver /data/local //将gdbserver发送板上
adb shell chmod 777 /data/local/gdbserver //改为可执行的属性
//adb forward 发布端口,作为主机向模拟器或设备的请求端口
adb forward tcp:10000 tcp:10000
//用gdbserver启动CMController,gdbserver的端口是tcp:10000
adb shell /data/local/gdbserver :10000/data/local/qqtest_shared
步骤三
在eclipse下选择sp2 Default进行调试。出现的调试界面如下: