Blink/Webkit浏览器内核崩溃分析过程总结

前两天技术团队旺旺群里有同事提出一个问题:在debug模式下,Chromium浏览器打开http://product.suning.com/125073744.html页面renderer进程就立即崩溃。团队对于Blink/Webkit内核问题的分析经验不多,故把分析过程写出一个总结,希望对大家以后分析此类问题有帮助。

多进程调试

Chromium浏览器是多进程的架构。而Blink内核在renderer进程,debug模式下,VS调试不能抓到renderer进程的异常,也就无法定位问题。所以解决问题的第一步是把VS调试器附加到问题相应的renderer进程。

Chromium已有一篇文档讲述如何调试Chromium。对于浏览器子进程的调试,有一个–wait-for-debugger-children的命令行参数。给浏览器传递这个命令行参数之后,生成的子进程都会在一开始等待调试器60秒附加上去。另外这个命令行还可以指定是plugin进程还是renderer进程。因为这次调试的对象是renderer进程,故我们在VS调试器设置–wait-for-debugger-children=renderer传递给被调试的浏览器。

重现问题

用VS打开Chromium的源代码工程,并在debug模式下运行。启动浏览器之后,新建tab页,在地址栏里输入会导致renderer进程崩溃的网址http://product.suning.com/125073744.html。这时候就是生成对应的renderer进程。这个renderer进程在60秒等待我们把调试器附加上去。

我们找到新建renderer进程的PID,然后用VS的debug->Attach to Process菜单里附加到那个进程,附加成功后继续运行调试器。调试器就会立即跳到ASSERT(!currBox->needsLayout());这行代码。正是这行代码的触发的ASSERT导致renderer进程的崩溃。

分析问题

看这行代码的意思,当前的html元素assert不需要layout,也许问题跟laytou相关。再看看上下文,貌似也没有什么线索。

这个时候我们需要观察Blink内核渲染的状态。这里有几个辅助调试的函数,showTreeForThis()、showLayoutTreeForThis()。这些函数可以显示当DOM树和layout的状态。在Immediate Window输入showTreeForThis(),就会看到如下图内容:

debug-chromium-immediate-window

查看上图最后乱码的字符串“问卷调查”内容是“问卷调查”,然后搜索Web页面的html找到“问卷调查”的元素,可以初步猜测问题可能出现在里。

另外在Google查”ASSERT(!currBox->needsLayout()); “,就会发现这是个Webkit内核的老bug,https://code.google.com/p/chromium/issues/detail?id=144608。 根据网上对这个问题的讨论,是Webkit内核对元素的position属性layout有问题。

确认一下这个问题,我们把”问卷调查“所在的div的position属性去掉。然后再在debug下面打开有问题网址,就不会再崩溃了。

debug-chromium-crash-result

发表评论

电子邮件地址不会被公开。 必填项已用*标注