您的位置:首页 > 移动开发

Chromium WebView C++代码的调试

2017-03-07 23:38 411 查看
从Android 4.4开始,系统的WebView组件就采用了Chromium/Blink引擎。Chromium的代码及其庞大,理解起来也有些难度。借助于gdb调试,通过跟踪代码的运行,打印调用堆栈,有助于理解代码的执行流程。另外libchromiumwebview.so的编译链接及其耗时间,所以那种打log的方式除非不得已,还是要尽量少用。虽然Chromium for Android以及Chromium桌面版都采用了多进程模型,但Chromium WebView却是采用的单进程模型,所以调试上简单了很多。

下面以Android 5.1为例,调试脚本如下:

#!/bin/bash

# check env setup first
if [ ! "$ANDROID_BUILD_TOP" ]; then
echo "please source build/envsetup.sh to set env var first!"
exit
fi

GDBSERVER_LOG=temp.log
BROWSER_PACKAGE_NAME="com.android.browser"
BROWSER_ACTIVITY="BrowserActivity"

# adbd get root privileges
adb root
sleep 5

# get pid of browser
PID=$(adb shell ps | grep $BROWSER_PACKAGE_NAME | awk '{print $2}')
echo "pid of $BROWSER_PACKAGE_NAME is $PID"
if [ ! "$PID" ]; then
adb shell am start -n $BROWSER_PACKAGE_NAME/.$BROWSER_ACTIVITY
sleep 2
PID=$(adb shell ps | grep $BROWSER_PACKAGE_NAME | awk '{print $2}')
fi

# kill gdbserver
gdbserver_pid=$(adb shell ps | grep "gdbserver" | awk '{print $2}')
if [ "$gdbserver_pid" ]; then
adb shell kill $gdbserver_pid
fi

# gdbserver attach browser pid in background
echo "attach pid $PID in background"
(adb shell gdbserver :5039 --attach $PID > $GDBSERVER_LOG 2>&1) &

sleep 2

touch gdb.init
readonly COMMANDS=gdb.init
echo -n "" > $COMMANDS
echo "ANDROID_BUILD_TOP = $ANDROID_BUILD_TOP"
adb forward tcp:5039 tcp:5039

echo "file $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/bin/app_process32" >> $COMMANDS
echo "set solib-absolute-prefix $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/lib" >> $COMMANDS
echo "set solib-search-path $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/lib" >> $COMMANDS
echo "target remote :5039" >> $COMMANDS

$ANDROID_TOOLCHAIN/arm-linux-androideabi-gdb  -x $COMMANDS &&

# kill gdbserver
gdbserver_pid=$(adb shell ps | grep "gdbserver" | awk '{print $2}')
if [ "x$gdbserver_pid"!="x" ]; then
adb shell kill $gdbserver_pid
fi
echo "done"


在执行这个脚本之前,需要设置一些android源码build的环境变量。比如为nexus 4 build系统的命令为:

source ./build/envsetup.sh
lunch aosp_mako-userdebug


如果你在调试过程中遇到讨厌的如下中断错误:

Program received signal SIG33, Real-time event 33.


解决方法如下为,在gdb调试符下输入如下命令:

(gdb) handle SIG33 nostop noprint noignore pass


在下一片文章中,我将会说明如何调试Java部分的代码。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: