Chromium WebView C++代码的调试

来源:互联网 发布:java开发网上商城 编辑:程序博客网 时间:2024/05/20 02:30

从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 firstif [ ! "$ANDROID_BUILD_TOP" ]; then    echo "please source build/envsetup.sh to set env var first!"    exitfiGDBSERVER_LOG=temp.logBROWSER_PACKAGE_NAME="com.android.browser"BROWSER_ACTIVITY="BrowserActivity"# adbd get root privilegesadb rootsleep 5# get pid of browserPID=$(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 gdbservergdbserver_pid=$(adb shell ps | grep "gdbserver" | awk '{print $2}')if [ "$gdbserver_pid" ]; then    adb shell kill $gdbserver_pidfi# gdbserver attach browser pid in backgroundecho "attach pid $PID in background"(adb shell gdbserver :5039 --attach $PID > $GDBSERVER_LOG 2>&1) &sleep 2touch gdb.initreadonly COMMANDS=gdb.initecho -n "" > $COMMANDSecho "ANDROID_BUILD_TOP = $ANDROID_BUILD_TOP"adb forward tcp:5039 tcp:5039echo "file $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/bin/app_process32" >> $COMMANDSecho "set solib-absolute-prefix $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/lib" >> $COMMANDSecho "set solib-search-path $ANDROID_BUILD_TOP/out/target/product/mako/symbols/system/lib" >> $COMMANDSecho "target remote :5039" >> $COMMANDS$ANDROID_TOOLCHAIN/arm-linux-androideabi-gdb  -x $COMMANDS &&# kill gdbservergdbserver_pid=$(adb shell ps | grep "gdbserver" | awk '{print $2}')if [ "x$gdbserver_pid"!="x" ]; then    adb shell kill $gdbserver_pidfiecho "done"

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

source ./build/envsetup.shlunch aosp_mako-userdebug

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

Program received signal SIG33, Real-time event 33.

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

(gdb) handle SIG33 nostop noprint noignore pass

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

0 0
原创粉丝点击