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

使用hello-gl2建立ndk-gdb环境

原创,转载请注明出处

孔子曰,学而不思则罔,思而不学则殆,对于程序员来说,则是,读而不调则罔,调而不思则殆。所以,学习要知行合一,程序员则是读调合一。Dos时代,大家都知道debug对普通的汇编程序而言太重要,对于一般C程序也是非常重要的。而linux时代,gdb提供了更强大的功能。

Android是从linux进化而来,gdb是否可以使用呢?特别是对于jniC/C++程序,答曰,可以的。下面我们以hello-gl2为例子,我们试着完成类似dos和字符linuxdebug程序。

1,安装64ubuntu 10.04,安装jdk/sdk/eclipse/ndk

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

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.exeAndroid下面可以吗。答案是肯定的,我们只需要做一些工作来欺骗ndk-gdb脚本就可以了。

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

2,使用apktool解包GL2JNIActivity.apk

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

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

5,重命名lib目录为libs

6,从hello-gl2/libs/armeabi/目录下拷贝gdb.setupgdbserver两个程序到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了。

图片无法上传,请去我的资源下载我的附件


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值