Android gdb 調試

其實拋開android 應用環境,Gdb 本身就是個神蹟。

Gdb作用:

1、啓動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。

2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)

3、當程序被停住時,可以檢查此時你的程序中所發生的事。

4、你可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。

Gdb原理圖:


Android gdb 調試作用:

特別對於android native code,有時當我們難以理清程序動態執行時複雜函數調用、參數傳遞設置等等時,那麼此時可以考慮gdb了。

 

如何使用Android gdb 調試

Target : android 4.2.2 真機

Host : Ubuntu 64

1.target 端:

1.1 進入adb 查看目標機器當前gdbserver版本號,如果沒有安裝則需要到源碼ndk目錄下找到相應gdbserverpush/system/bin/目錄下

 1.1.2 ps 命令查看所要調試進程號,以mediaserver爲例


1.3 目標端監聽mediaserver進程

 

 

2.HOST

2.1 找到相應的gdb調試程序

../prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.6/bin/arm-linux-androideabi-gdb

嘗試運行./arm-linux-androideabi-gdb,但報錯:

 error while loading shared libraries: libpython2.6.so.1.0: cannot open shared object file: No such file or directory

解決方法:sudo ln -s /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 /usr/lib/x86_64-linux-gnu/libpython2.6.so.1.0

2.2 運行gdb,注意gdb 版本


2.3 實現hosttarget遠程監聽,tcp 1234代表local,後代表remote

 

到目前爲止,看起來很順利。。

2.4 加載調試二進制文件,一定要注意要與目標調試進程相對應。如調試進程mediaserver,我需要加載mediaserver,如果是app,則需要加載app_process.還要注意路徑爲symbols下。

 

2.5設置相應debug 包含symbols的庫文件,同樣注意路徑爲symbols

庫文件絕對路徑:

set solib-absolute-prefix /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/

庫文件相對路徑:

set solib-search-path /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/

此時如果ok的話,可以看到相應的動態鏈接庫加載成功了。

Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/bin/linker...done.

Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/bin/linker

Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libc.so...done.

Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libc.so

Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libstdc++.so...done.

Loaded symbols for /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libstdc++.so

Reading symbols from /home/wangbin/wz_code/4-2-2_r1_wbBranch/out/target/product/rk30sdk/symbols/system/lib/libm.so...done

....................................

3.可以開始調試之旅了,我在audioflinger 加斷點,可以看到gdb的強大了,哈哈。

   

正如你所看到的,很順利可以用gdb調試了,但過程真的如此麼?其實略坎坷,實際中可能會遇到各種問題。例如:cannot access adrress 0x.... 或者info sharedlibrary 顯示動態庫未加載。可以嘗試兩個思路,一個是對應gdb版本是否匹配。如果你非常細心的話(當然,沒看到也不代表不細心。。),2.2圖中,我所運行並不是2.1路徑下的gdb,版本不匹配可能會導致了一系列的問題。二就是host端file一定要加載對應的可執行文件。關於絕對路徑和相對路徑加載詳細解釋可參考:http://blog.csdn.net/_xiao/article/details/23289971 之前還谷歌了一文也不錯,但沒及時保存,怪我咯!

參考文章:

http://www.cnblogs.com/scue/p/4462523.html

http://blog.csdn.net/xinfuqizao/article/details/7955346

http://blog.chinaunix.net/uid-12567959-id-3214283.html

http://blog.chinaunix.net/uid-21254310-id-3447060.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章