其實拋開android 應用環境,Gdb 本身就是個神蹟。
Gdb作用:
1、啓動你的程序,可以按照你的自定義的要求隨心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、你可以改變你的程序,將一個BUG產生的影響修正從而測試其他BUG。
Gdb原理圖:
特別對於android native 層code,有時當我們難以理清程序動態執行時複雜函數調用、參數傳遞設置等等時,那麼此時可以考慮gdb了。
如何使用Android gdb 調試:
Target : android 4.2.2 真機
Host : Ubuntu 64位
1.target 端:
1.1 進入adb 查看目標機器當前gdbserver版本號,如果沒有安裝則需要到源碼ndk目錄下找到相應gdbserver,push到/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 實現host對target遠程監聽,前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