如何使用gdb調試android webkit核心代碼
紅心地瓜
得益於指令碼的協助,在Emulator中使用GDB調試Native Code的設定非常簡單,比如我用gdb+gdbserver調試webkit
1. 找到你的toolchain對應的gdb,在模擬器上是arm-eabi-gdb,在prebuild下,把它的目錄加到PATH裡面
export PATH=$ANDROID_SRC/prebuilt/linux-x86/tootlchain/arm-eabi-4.4.0/bin:$PATH
或者直接加到~/.bashrc裡面
2 執行配置指令碼
cd$ANDROID_SRC
source build/envsetup.sh
3 啟動模擬器,運行瀏覽器
l gdbclient app_ process :5039 browser
此時就能看到gdb順利啟動起來了(儘管有warning),此時就可以使用你熟悉的gdb命令了
看到
15 ldmdf sp! {r4,r7}
Currentlanguage: auto;current asm
4 設定斷點
bFrameLoaderClientAndroid.cpp:868
5 執行
c
6 訪問一個網址,就可以看到gdb斷點了,enjoy it!
在target上搭建這個環境複雜一點,因為target出於空間的考慮,編譯的是release庫,而且有一個prelink的過程,主要是要修改map檔案來放下webcore的debug庫。
在target上搭建這個環境複雜一點,因為target出於空間的考慮,編譯的是release庫,而且有一個prelink的過程,主要是要修改map檔案來放下webcore的debug庫。
以下的實驗環境是我的htc magic + cm6.0
1 .如果$ANDROID_SRC根目錄下沒有buildspec.mk,執行以下操作,如果有,忽略此步驟
mv build/buildspec.mk.default build/buildspec.mk
2. 修改buildspec.mk,加入以下幾行
DEBUG_MODULE_libwebcore:=true
DEBUG_MODULE_libxml2:=true
TARGET_CUSTOM_DEBUG_CFLAGS:=-O0 -mlong-calls
"ADDITIONAL_BUILD_PROPERTIES+= debug.db.uid=100000
lmka bacon編譯,prelink失敗
prelink maperror: library libwebcore.so@0xa8300000 is too big at 10644851 bytes, it runs3304819 bytes into librarylibexpat.so@0xa8a00000!
可以看出,libwebcore有3M的空間越界了,其實我加了3M還不夠,是3M多一點,所以要加4M
3.修改$ANDROID_SRC/build/core/prelink-linux-arm.map(改前請備份哦)
搜尋libwebcore.so,發現
libsqlite.so 0xA8B00000 # [~2M]
libexpat.so 0xA8A00000 # [~1M]
libwebcore.so 0xA8300000 # [~7M]
將libwebcore.so的大小加到11M,也就是如下
libsqlite.so 0xA8F00000 # [~2M]
libexpat.so 0xA8E00000 # [~1M]
libwebcore.so 0xA8300000 # [~11M]
libsqlite.so之上的.so也要對應改動,這裡忽略。有一點小工作量,網上有介紹可以通過修改Android.mk來disable prelink,我試了下,沒有成功,所以我就老老實實改了這個prelink的map檔案。
剩下的就和emulator一樣了。