天天看點

《深入了解Android》一1.4 WebKit代碼調試

本節書摘來自華章出版社《深入了解android》一書中的第1章,第1.4節,作者孟德國 王耀龍 周金利 黎歡,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視

android平台webkit的調試分析的常用手段包括列印log、remote gdb調試以及分析crash dump等,下面分别介紹。

(1)列印log,将系統的運作資訊輸出到log系統

webkit 代碼量較大,很多邏輯非常複雜,單純的斷點調試,很難直覺看到想要觀察的資料。一方面對于一些嵌套非常強的邏輯,如遞歸等,使用斷點調試很難直覺看到互相關系。webkit中一個典型的遞歸應用就是對render樹等樹形結構的周遊,如果我們要列印出一棵render樹的各個節點,要直覺地看到其結構,就需要使用log。另一方面webkit中很多對象巨大,變量隐藏很深,可能有多個基類包含多次繼承,并且還有智能指針的包裹,使得使用動态調試觀看非常麻煩,是以傳統的log列印對于我們來說仍然必要。在android系統下,列印log函數是__android_log_print,其輸出的log通過adb logcat檢視。一般使用定義宏:

在使用__android_log_print 前,先要在webkit的android.mk中加上liblog.so庫的連接配接依賴,具體如下:

(2)通過ndk-stack檢視webkit native crash時導出的棧資訊

當程式崩潰時,需要知道crash 發生在哪裡,crash時函數的調用棧細節等資訊。 android程式崩潰時,會通過log系統輸出crash時的寄存器和棧資訊,部分機器會在/data/tombstones目錄産生crash日志檔案。将crash時産生的stack dump資訊儲存在crash.txt中,通過如下指令檢視crash 時棧的dump資訊:

symbol_so_path是符号庫目錄,在android源碼中是out/target/product/xx/symbol/system/lib。

 關于android crash dump産生的原理可參考3.3節。

(3) 通過remote gdb直接動态調試運作中的浏覽器

如果需要斷點調試,單步跟蹤,檢視線程棧,此時就要使用gdb。android源碼本身提供腳本gdbclient連接配接裝置上的gdbserver。将gdbserver push目标裝置的特定目錄(gdbserver可在android源代碼的prebuilt目錄下找到,也可以從ndk中擷取),賦予其可執行權限。在shell中啟動裝置上的gdbserver 并attach到browser線程:

其中5039為端口号,也可以自定義為其他端口。在另一個shell中啟動端口映射:

啟動gdbclient:

看到gdb的指令提示符“(gdb )”後,輸入如下指令以載入符号庫:

等到各個lib加載完畢,就能看到gdb順利啟動起來,并再次顯示指令提示符(gdb)。此後可以根據需要輸入相應指令,比如設定斷點:

b frameloaderclientandroid.cpp:868

執行c,通路一個網址,就可以看到gdb斷點了。此後就是我們熟悉的gdb指令了。

繼續閱讀