使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境)

使用hello-gl2建立ndk-gdb环境
 
孔子曰,学而不思则罔,思而不学则殆,对于程序员来说,则是,读而不调则罔,调而不思则殆。所以,学习要知行合一,程序员则是读调合一。Dos时代,大家都知道debug对普通的汇编程序而言太重要,对于一般C程序也是非常重要的。而linux时代,gdb提供了更强大的功能。
 
Android是从linux进化而来,gdb是否可以使用呢?特别是对于jni的C/C++程序,答曰,可以的。下面我们以hello-gl2为例子,我们试着完成类似dos和字符linux下debug程序。
 
1,安装64位Ubuntu 10.04,安装jdk/sdk/eclipse/ndk

使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境)

2,编译libgl2jni.so,使用参数NDK_DEBUG=1

使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境)
 

3,打开eclipse,导入工程到eclipse
 
在左边packages栏,点击鼠标右键,选择import
 

选择Existing Projects into Workspace,点击next
 


选择Browse,指定hello-gl2的目录
 

 

4,单击finish完成导入
 

5,为了调试方便我们对代码稍做修改
 
GL2JNILib.java去掉System.loadLibrary("gl2jni");
 

GL2JNIActivity.java添加如下代码
 
Log.e("zcfdebug", "Now we will wait for 5 s");
 
        try {
 
Thread.sleep(5000);
 
} catch (InterruptedException e) {
 
// TODO Auto-generated catch block
 
e.printStackTrace();
 
}   

        Log.e("zcfdebug", "Now we finish waiting for 5 s");
 
        super.onCreate(icicle);
 

 

6,连接上设备,运行试试看。
 

7,运行../../ndk-gdb --verbose --launch=com.android.gl2jni.GL2JNIActivity
 


8,设置断点,br Java_com_android_gl2jni_GL2JNILib_init
 

9,按C继续运行,可以看出,程序已经停在我们需要停止的地方。
 


至此,环境完全搭建完成,你可以像本地一样的调试程序了。
 


这是有源码的情况,如果没有源码怎么办?Dos下面,我们可以使用debug xxx.exe,Android下面可以吗。答案是肯定的,我们只需要做一些工作来欺骗ndk-gdb脚本就可以了。
 

1,在sample目录下建立一个test目录,把hello-gl2目录下的最终apk文件copy到test目录下
 

2,使用apktool解包GL2JNIActivity.apk
 

3,把目录GL2JNIActivity拷贝到上一级目录下面
 

4,修改AndroidManifest.xml,添加<uses-sdk android:minSdkVersion="5"/>
 

5,重命名lib目录为libs
 


6,从hello-gl2/libs/armeabi/目录下拷贝gdb.setup和gdbserver两个程序到test/libs/armeabi/
 

7,建立./obj/local/armeabi目录,并cp libs/armeabi/libgl2jni.so obj/local/armeabi/
 


8,伪装jni目录,从任意sample目录下copy jni目录过来都可以。
 

9,完成之后,安装程序adb install GL2JNIActivity.apk
 
10,把目标机/data/data/com.android.gl2jni/lib目录属性改为可读写,要试具体机器实施
 
1)adb shell
 
2)Shell下执行mount
 
root@android:/ # mount
 
rootfs / rootfs ro,relatime 0 0
 
tmpfs /dev tmpfs rw,nosuid,relatime,mode=755 0 0
 
devpts /dev/pts devpts rw,relatime,mode=600 0 0
 
proc /proc proc rw,relatime 0 0
 
sysfs /sys sysfs rw,relatime 0 0
 
debugfs /sys/kernel/debug debugfs rw,relatime 0 0
 
none /acct cgroup rw,relatime,cpuacct 0 0
 
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
 
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
 
none /dev/cpuctl cgroup rw,relatime,cpu 0 0
 
emmc@android /system ext4 ro,noatime,user_xattr,commit=1,barrier=1,nodelalloc,data=journal,noauto_da_alloc 0 0
 
emmc@usrdata /data ext4 rw,nosuid,nodev,noatime,user_xattr,barrier=1,data=ordered,noauto_da_alloc 0 0
 
emmc@cache /cache ext4 rw,nosuid,nodev,noatime,user_xattr,barrier=1,data=ordered,noauto_da_alloc 0 0
 
/dev/block/vold/179:4 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 
/dev/block/vold/179:4 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 
tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
 
/dev/block/dm-1 /mnt/asec/com.example.hellojni-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 
/dev/block/dm-0 /mnt/asec/com.android.gl2jni-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
 

3)mount -o rw,remount /mnt/asec/com.android.gl2jni-1
 
4)chmod 777 /mnt/asec/com.android.gl2jni-1
 
11,把gdbserver push到/data/data/com.android.gl2jni/lib
 
adb push ./libs/armeabi/libgl2jni.so /data/data/com.android.gl2jni/lib/
 
12,执行../../ndk-gdb --verbose --launch=com.android.gl2jni.GL2JNIActivity,顺利进入debug模式
 

13,在ida pro中间打开libgl2jni.so,找到我们赶兴趣的函数
 


14,加断点
 

注意,和上面有源码调试不一样,没有行号信息。
 
15,至此后面操作几乎和有源码一样了。
 


全部ok。
 
我们可以在Android上和dos linux一样debug了。
 

使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境) 图文版下载:

具体下载目录在 /2013年资料/6月/13日/使用hello-gl2建立ndk-gdb环境(有源码和无源码调试环境)

相关推荐