《深入理解Android》一1.4 WebKit代码调试

简介:

本节书摘来自华章出版社《深入理解Android》一书中的第1章,第1.4节,作者孟德国 王耀龙 周金利 黎欢,更多章节内容可以访问云栖社区“华章计算机”公众号查看

1.4 WebKit代码调试

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查看。一般使用定义宏:

#define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG,__VA_ARGS__)
// 定义LOGD类型
#define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG,__VA_ARGS__)
// 定义LOGI类型
#define LOGW(...)  __android_log_print(ANDROID_LOG_WARN,LOG,__VA_ARGS__)
// 定义LOGW类型
#define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG,__VA_ARGS__)
// 定义LOGE类型

在使用__android_log_print 前,先要在WebKit的Android.mk中加上liblog.so库的连接依赖,具体如下:

LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llog

(2)通过ndk-stack查看webkit native crash时导出的栈信息
当程序崩溃时,需要知道crash 发生在哪里,crash时函数的调用栈细节等信息。 Android程序崩溃时,会通过log系统输出crash时的寄存器和栈信息,部分机器会在/data/tombstones目录产生crash日志文件。将crash时产生的stack dump信息保存在crash.txt中,通过如下命令查看crash 时栈的dump信息:

ndk-stack -sym $SYMBOL_SO_PATH -dump crash.txt

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线程:

$adb shell ps |grep com.android.browser #找到浏览器进程pid,需要先启动浏览器
$adb shell gdbserver :5039 --attach PID

其中5039为端口号,也可以自定义为其他端口。在另一个shell中启动端口映射:

$sudo adb forward tcp:5039 tcp:5039

启动gdbclient:

arm-eabi-gdb out/target/product/xx/symbols/system/bin/app_process

看到gdb的命令提示符“(gdb )”后,输入如下命令以载入符号库:

set solib-absolute-prefix out/target/product/xx/symbols/system/lib/
set solib-search-path out/target/product/xx/symbols/system/lib/
target remote:5039

等到各个lib加载完毕,就能看到gdb顺利启动起来,并再次显示命令提示符(gdb)。此后可以根据需要输入相应命令,比如设置断点:
b FrameLoaderClientAndroid.cpp:868
执行c,访问一个网址,就可以看到gdb断点了。此后就是我们熟悉的gdb命令了。

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
3月前
|
存储 消息中间件 人工智能
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
【03】AI辅助编程完整的安卓二次商业实战-本地构建运行并且调试-二次开发改注册登陆按钮颜色以及整体资源结构熟悉-优雅草伊凡
138 3
|
3月前
|
缓存 Unix Android开发
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
Android安卓项目调试之Gradle 与 Gradle Wrapper的概念以及常用gradle命令深度详解-优雅草卓伊凡
337 8
|
3月前
|
存储 API Android开发
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
200 4
【02】完整的安卓二次商业实战-配置gradle-构建打包原生安卓项目-调试本地运行模拟器-优雅草伊凡
|
5月前
|
编解码 Java Android开发
安卓虚拟摄像头免root版,虚拟摄像头替换真实摄像头,jar代码开源分享
通过动态替换摄像头输入流的方式实现虚拟摄像头功能,代码经过简化展示核心逻辑。实际开发中还需要考虑视频编解码优化
|
9月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
10月前
|
缓存 Java 测试技术
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
1344 3
【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
|
11月前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
513 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
490 8
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
310 1
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异:从代码到用户体验
【10月更文挑战第5天】在移动应用开发的广阔天地中,安卓和iOS两大平台各占半壁江山。它们在技术架构、开发环境及用户体验上有着根本的不同。本文通过比较这两种平台的开发过程,揭示背后的设计理念和技术选择如何影响最终产品。我们将深入探讨各自平台的代码示例,理解开发者面临的挑战,以及这些差异如何塑造用户的日常体验。