浏览器M55内核升级最后一个崩溃

最近做M55内核升级,我负责浏览器的稳定性。陆陆续续把各种崩溃都修复的差不多了,只剩下最后一个崩溃了,其崩溃堆栈如下: 在执行这行代码的时候发生了崩溃: 初步一看,这个崩溃点在Chromium原生的代码里面,所以怀疑是Chromium自己的bug。于是在https://bugs.chromium.org/p/chromium/issues/list里面搜索相关堆栈关键词,看看能不能找到类似的崩溃。很遗憾的是并没有搜到有用的信息。 然后再去https://groups.google.com/a/chromium.org/forum/#!forum/chromium-dev里面碰碰运气,仍然是一无所获。看来是指望不上Chromium社区的帮助了,只能自己动手,丰衣足食。 因为我们抓的崩溃dump只包含栈上的内存,另外浏览器Release版本做了编译器优化,导致很多栈上变量值都优化的不可见。因此崩溃dump里面包含的有用信息并不多,只能看到浏览器崩溃在哪行代码,却不能观察到浏览器崩溃时所处的状态,如Windbg里面查看到变量信息下图所示: 为此,通过Alias函数引用到栈上变量,防止它被优化,Alias函数如下图所示: 然后把自己关心的信息,都存到栈上分配的内存上,比如我想知道崩溃的时候请求的url、cookie等信息,如下图所示: 加上这些收集调试信息的代码,再灰度出去收集新的dump。通过分析新的dump果然有了一些有用的信息。可以看到浏览器崩溃的时候first_party_for_cookies对于的url都是天猫、淘宝的商品页面,而此时网络请求的url也都是https://gm.mmstat.com/tbdetail的url,如下图所示: 可以确定浏览器都是访问淘宝天猫出现的崩溃,但是我本地试了试,并不能复现问题。为了找到可以复现的崩溃场景,我在浏览器崩溃的时候,利用QQ的tencent://协议自动打开QQ跟我联系,代码如下: 继续灰度出去一版,等待崩溃的用户联系我。 我这边继续分析之前的崩溃dump,可以排除是空指针崩溃。发现cookie_store变量很有意思,其中一个dump如下: 可以看到cookie_store指向的net::CookieStore对象的虚函数表地址竟然是0xe43a00f2,已经跑到系统的地址空间里面去了,显然超出了合法的地址范围。而有的dump则是这样: 虽然虚函数表地址是正常的,但是其中虚函数指针都是错的,我猜可能是UAF(Use... Read More | Share it now!

创建新的Chromium extension api

不同编程语言的开发效率是不一样的,比如c++可以实现一些很底层的功能,但是开发速度比较慢,对开发者的要求也很高。而javascript开发速度很快,编程的抽象层次很高,无法调用一些系统底层的api。于是我们想到可以把c++与javascript结合起来,c++给javascript提供一些底层的api接口,javascript调用c++的接口并专注于业务开发,这样岂不两全其美。 事实上真有这样做的,比如Chromium浏览器,浏览器本身是用c++编写的,提供了很多extension... Read More | Share it now!

Chrome extension的类型

Chrome中的extension概念跟我们一般想的不一样,除了一般的extension,比如广告过过滤extension是属于extension,其实Chrome中的theme也是属于extension。另外随着extension系统的发展,类型的定义也会发生改变。 Extension类型的定义 我们可以在代码extensions\common\manifest.h中查看Manifest::Type的定义: 此外我们可也以从代码extensions\common\api\management.json中可以看到ExtensionType的定义: 这两处对于extension类型的定义有些差异,management.json定义渐渐废弃,以manifest.h中的定义为准。 Extension类型的判断 判断一个extension类型是看extensions\common\extension.h中的判断逻辑: Extension最后还是调用Manifest中的逻辑: 在Manifest构造函数中: 可以看到extension类型的判断逻辑: theme 类型为Manifest::Type::TYPE_THEME的extension就是一个theme(主题),它可以改变浏览器的外观。theme通常不会包含有html和js等代码。具体可以看看这里的介绍https://developer.chrome.com/extensions/themes。 shared_module shared_module类型很少见。 app app包含三种类型,platform_app、hosted_app、legacy_packaged_app。2016年Chrome宣布将不再支持app类型了。app与extension最大的差别是app可以具有独立于浏览器的窗口界面。app相比extension可以获取到更多的权限,能够实现更加强大的功能。 extension 我们在Chrome网上应用店里面下载到扩展程序都是属于extension,这也是最常见的,如下图: ... Read More | Share it now!

Breakpad崩溃报告系统介绍

Breakpad是Google开发的一套开源的崩溃报告系统,它是跨平台的,支持Windows、Linux、Mac等操作系统,被Chrome、Firefox等各大软件采用。最近做Chromium内核升级,需要把Breakpad升级成Crashpad,故再看看Breakpad项目的实现,写篇博客总结一下。 Breakpad的机制 如上图所示是Breakpad的工作机制,它是参考Windows上那套崩溃处理机制。Windows上面编译器把代码编译成可执行文件,同时生成包含调试信息的PDB符号文件。程序运行发生崩溃时,将崩溃的堆栈等信息存储成一个dump文件。调试器打开dump文件并读取PDB里面的调试信息,就可以看到崩溃的堆栈。因为Breakpad是跨平台的,所以在Linux等其他平台也实现了Windows上的生成调试符号、生成dump、处理dump等功能。 Breakpad分为3个主要的模块: Client。Client模块会被编译到客户端程序中,它的职责包括捕获客户端的异常、生成崩溃的dump文件、上报dump文件到服务器。在Windows平台,我们只需要这部分就足够了。 Symbol... Read More | Share it now!

Chromium静默安装扩展

Chromium有非常强大的扩展系统,很多功能可以通过扩展实现,比如广告过滤,购物比价。所以开发Chromium功能,不一定需要修改Chromium的C++源代码,只需要做一个扩展就可以了。 通过Chromium的扩展来增强浏览器功能,有多个优点: 功能耦合低。浏览器客户端只需要提供相应的接口API,扩展去调用相应的接口API即可。 开发客户端接口API和开发扩展可以并行。另外Chromium有完善的扩展系统,调试等等都非常方便。 升级独立。以后升级扩展就可以升级功能了,而不需要升级整个浏览器。 开发速度开。因为扩展大多数是用的web开发技术,就是html和js,所以开发起来很快。而修改Chromium的c++代码则复杂很多。 随着Chromium安全策略的收紧,一般来说,只能通过Chrome的应用商店来安装扩展,禁止其他扩展静默安装。https://developer.chrome.com/extensions/external_extensions根据这篇文档的描述,浏览器想内置一些扩展限制很多,比较麻烦。如果自己定制浏览器,想默认安装一些扩展,不是很方便。 其实,如果改代码的话,就没有任何限制,直接调用extensions::CrxInstaller去安装。下面是静默安装本地crx扩展文件的例子: 以前大概是2015年前,Chromium也是可以静默的安装内置的扩展的,现在代码里面需要改一点也是支持的。 把我们需要内置的扩展放到chrome/browser/resources/default_apps里面,这个目录已经有了几个其他的内置扩展,比如docs.crx、drive.crx等等。 此外需要在external_extensions.json里面添加我们扩展的信息。 当浏览器启动的时候,ExtensionService会调用default_apps::Provider会按照external_extensions.json的描述去安装我们内置的扩展。   ... Read More | Share it now!