真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

androidgdb調(diào)試實(shí)例演示(有源代碼篇)-創(chuàng)新互聯(lián)

android ndk代碼的調(diào)試本身還是有點(diǎn)麻煩的,因?yàn)楸旧韌oogle android的sdk
主要是面向廣大的java程序員的,所以后來(lái)發(fā)布的 ADT 集成開發(fā)環(huán)境對(duì)java的代碼調(diào)試
支持還是很好的,但是對(duì)于 ndk編寫的so代碼就沒(méi)有那么直觀的圖形界面的調(diào)試工具了。

   相信將來(lái)google肯定要開發(fā)出來(lái) 調(diào)試c/c++代碼的圖形調(diào)試工具,但是目前大多數(shù)剛開始
用ndk編寫c或者c++代碼的程序員調(diào)試的時(shí)候一般還是打log,然后再根據(jù)log來(lái)進(jìn)行分析。
這種方法雖然簡(jiǎn)單,但是缺點(diǎn)也是很明顯的,很多詳細(xì)的信息不能調(diào)試,為了解決這個(gè)問(wèn)題,
我寫了這篇 android gdb 調(diào)試本地so的實(shí)例演示,以供大家參考。

   做任何事情都是有代價(jià)的,用log調(diào)試的方法簡(jiǎn)單方便,用android gdb調(diào)試就需要記下一些
命令,并且做一些前期的準(zhǔn)備工作了。

尉氏網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。成都創(chuàng)新互聯(lián)公司于2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司

前期準(zhǔn)備工作:

1 gdbserver 這個(gè)是需要放在android 手機(jī)里面的,一般放在 /system/bin/目錄即可。
 注意:直接從android源碼編譯出來(lái)的 gdbserver 放到android 手機(jī)中運(yùn)行一般會(huì)crash的
    官方的說(shuō)法是 bionic 庫(kù)不匹配導(dǎo)致,所以建議重新編譯一個(gè)gdbserver。具體如何
    編譯 gdbserver 見我的另外一篇博客
    http://sunzeduo.blog.51cto.com/2758509/1381552

2 對(duì)應(yīng)版本的 androidgdb

比如我的gdbserver是

shell@android:/ # gdbserver --version
GNU gdbserver (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
gdbserver is free software, covered by the GNU General Public License.
This gdbserver was configured as "arm-eabi-linux"

而使用的 android gdb應(yīng)該是

root@ubuntu:~/Desktop# ./androidgdb --version
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".
For bug reporting instructions, please see:
.

注意版本一致,而./androidgdb 需要你下載一個(gè)ndk里面有
我使用的在
/root/android/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gdb
這個(gè)路徑里面

3 會(huì)使用常用gdb命令,具體命令的介紹,見我的另外一篇博文
http://sunzeduo.blog.51cto.com/2758509/1387538

4 一個(gè)自己寫好的demo程序,這個(gè)我會(huì)放在附件中的,后面的調(diào)試都是以這個(gè)demo例子來(lái)進(jìn)行的
這里先大概介紹一下 這個(gè)demo程序中 jni的文件,一共有三個(gè)文件,如下圖

android gdb 調(diào)試實(shí)例演示(有源代碼篇)

target.c   是一個(gè)服務(wù)器代碼,隨著代碼啟動(dòng)而啟動(dòng)運(yùn)行
socketclient.c  是個(gè)客戶端代碼,給java層提供jni接口
socketback.c   打醬油的不用管他

開始調(diào)試

前期準(zhǔn)備的工作做好以后,可以開始調(diào)試了。

1 首先啟動(dòng)要調(diào)試的程序,ps 獲取其進(jìn)程號(hào) (手機(jī)界面操作即可)

shell@android:/ # ps | busybox grep socketcomm                              
u0_a66    26175 125   494016 50792 ffffffff 40090a40 S com.example.socketcomm
root      27938 27933 860    336   c04fbc9c 4004a5f4 S /data/data/com.example.socketcomm/files/target

2 啟動(dòng)gdbserver attach到目標(biāo)進(jìn)程  (手機(jī)shell中操作)

shell@android:/ # gdbserver remote:1234 --attach 26175
Attached; pid = 26175
Listening on port 1234

其中 remote:1234 表示映射成tcp的1234端口,這個(gè)時(shí)候重新打開一個(gè) adb shell 在ps com.example.socketcomm
發(fā)現(xiàn)

shell@android:/ # ps | busybox grep example
u0_a66    26175 125   494016 50792 ffffffff 40090a40 t com.example.socketcomm
root      27938 27933 860    336   c04fbc9c 4004a5f4 S /data/data/com.example.socketcomm/files/target

進(jìn)程狀態(tài)已經(jīng)變成 t了,表示 attach已經(jīng)成功了

3 啟動(dòng)gdb 來(lái)進(jìn)行調(diào)試 (pc環(huán)境中操作,我用的是ubuntu系統(tǒng))
root@ubuntu:~/Desktop# adb forward tcp:1234 tcp:1234
首先端口映射,映射成 1234 端口號(hào)

root@ubuntu:~/Desktop# ./androidgdb
GNU gdb (GDB) 7.3.1-gg2
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
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"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=arm-linux-android".
For bug reporting instructions, please see:
.
(gdb) target remote:1234
Remote debugging using :1234
0x40090a40 in ?? ()
(gdb)

這個(gè)時(shí)候已經(jīng)進(jìn)入 gdb了,當(dāng)然現(xiàn)在還沒(méi)有加載symbols 所以gdb的很多調(diào)試還不能用 輸入 list
bt 這些命令還是不太直觀或者不能使用

這里使用 file命令將symbols文件加載進(jìn)來(lái)。因?yàn)槲覀冇性创a,而本身android 源碼ndk編譯的時(shí)候
默認(rèn)是加 -g選項(xiàng)的,沒(méi)有被 strip的so庫(kù)在
/root/android/temp/socketcomm/obj/local/armeabi
這個(gè)目錄下,而在libs下的so是被 strip過(guò)的版本(strip剝光,表示去掉了symbols符號(hào)表的版本)

如下圖:

android gdb 調(diào)試實(shí)例演示(有源代碼篇)

(gdb) set solib-search-path /root/android/temp/socketcomm/obj/local/armeabi

這個(gè)命令將so 的路徑設(shè)置一下

設(shè)置完成以后

(gdb) list socketclient.c:97
92          LOGI("read data fail !");
93          return NULL;
94      }
95
96
97      buffer[recbytes]='\0';
98      LOGI("recv buff %s",buffer);
99
100     close(cfd);

發(fā)現(xiàn)已經(jīng)有代碼顯示了

(gdb) b socketclient.c:97
Breakpoint 1 at 0x56dd7044: file jni/socketclient.c, line 97.

具體代碼看 socketclient.c 這兩行是接收到服務(wù)器打代碼,然后通過(guò)logcat 打印出來(lái)的

我們?cè)谶@里設(shè)置斷點(diǎn)

(gdb) b socketclient.c:97
Breakpoint 1 at 0x56dd7044: file jni/socketclient.c, line 97.

繼續(xù)執(zhí)行

(gdb) c
Continuing.
[New Thread 26648]
[Switching to Thread 26648]
Breakpoint 1, Java_com_example_socketcomm_JniSocketClient_cliensocket (
    env=0x56d7e870, thiz=, jstr=)
    at jni/socketclient.c:97
97      buffer[recbytes]='\0';
(gdb) print buffer
$1 = "server back buff 64", '\000' 
(gdb) bt
#0  Java_com_example_socketcomm_JniSocketClient_cliensocket (env=0x56d7e870,
    thiz=, jstr=) at jni/socketclient.c:97
#1  0x4074de34 in ?? ()
#2  0x4074de34 in ?? ()
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

ok 在斷點(diǎn)處停止了,然后值也打出來(lái)了

更多調(diào)試技巧,需要看gdb的命令,demo程序見附件。

附件:http://down.51cto.com/data/2364249

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。


文章名稱:androidgdb調(diào)試實(shí)例演示(有源代碼篇)-創(chuàng)新互聯(lián)
瀏覽路徑:http://weahome.cn/article/descop.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部