程序调试方法

 

方法一  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进行调试。出现的调试界面如下: