歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用hello-gl2建立ndk-gdb環境(有源碼和無源碼調試環境)

使用hello-gl2建立ndk-gdb環境(有源碼和無源碼調試環境)

日期:2017/3/1 9:56:01   编辑:Linux編程

使用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

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.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環境(有源碼和無源碼調試環境) 圖文版下載:

免費下載地址在 http://linux.linuxidc.com/

用戶名與密碼都是www.linuxidc.com

具體下載目錄在 /2013年資料/6月/13日/使用hello-gl2建立ndk-gdb環境(有源碼和無源碼調試環境)

更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11

Copyright © Linux教程網 All Rights Reserved