Crashpad崩溃报告系统介绍

Mac OS X 10.10(Yosemite)的时候,系统不再支持Breakpad的所需要的进程外崩溃报告接口,因此Breakpad在Mac系统上临时切换成进程内的崩溃报告。但是由于有些进程是运行在沙箱里面,无法在进程内生产崩溃报告,这促成了Crashpad替换Breakpad的成为新一代崩溃报告系统。Chromium 42开始,Mac系统上开始使用Crashpad,Windows版本的Chromium从49开始也从Breakpad切换到了Crashpad。未来所有平台的Chromium都将切换到Crashpad。

Crashpad代码

Crashpad项目的URL是https://crashpad.chromium.org,上面一些Crashpad的文档。https://chromium.googlesource.com/crashpad/crashpad/+/master/doc/developing.md 描述的的是如何获取并编译Crashpad代码。Crashpad使用的是depot_tools来管理代码,做Chromium开发的朋友应该很熟悉了。

目前为止Crashpad还是使用的gyp来生成编译工程,不过看buildtools目录下面有gn,所以未来Crashpad可能要从gyp升级成gn。

Crashpad相比Breakpad来说有丰富的单元测试,这保证了Crashpad的代码的稳健性。Crashpad包括测试工程,总共有44个工程。工程虽然很多,其实代码并不多,这也是Crashpad的代码层次划分也很清晰一个说明。

Crashpad架构

crashpad

如上图所示,Crashpad的进程外崩溃报告技术思路跟Breakpad是类似的。启动一个Server进程,Server进程创建一个命名管道。Client进程通过命令管道与Server进程通信,注册自己。当Client发生异常的时候,就会通过事件通知Server。Server根据之前Clinet注册的信息,读取Client进程里面的数据,来生成dump。理解Breakpad的工作机制对于理解Crashpad同样有帮助,关于Breakpad,可以看看我之前写的Breakpad崩溃报告系统介绍。

 

crashpad-class

上图是Crashpad在Server和Client进程中的一些重要对象。Server和Client进程之间通信是ExceptionHandlerServer和CrashpadClient通过命名管道实现的。另外ExceptionHandlerServer还管理着Client进程注册的信息。当Client进程发生异常的时候,就通过信号量通知Server进程里的ExceptionHandlerServer。ExceptionHandlerServer进一步把信息传递给CrashReportExceptionHandler。CrashReportExceptionHandler是真正负责处理Client进程的异常并生成dump的类。Server进程生成的dump最终交给CrashReportDatabase类去管理。

Breakpad在Windows平台生成dump是通过Dbghelp库,而Crashpad则是自己实现一个crashpad_minidump库来生成。

Chromium中的Crashpad

Crashpad提供的接口很简单,很容易被集成到其他程序里面。Chromium Browser进程启动后,wWinMain在第一时间就去调用SignalInitializeCrashReporting去初始化Crashpad。ChromeCrashReporterClient继承自CrashReporterClient,它通过CrashReporterClient::StartHandler来启动一个crashpad-handler的chrome.exe进程。其调用栈如下图所示:

crashpad-client

所以现在chromium浏览器启动的第一个进程是brwoser进程,第二个进程是crashpad-handler进程,如下图:

crashpad-handler-proceess

browser进程通过StartHandler来启动crashpad-handler进程,并向crashpad-handler注册自己。后续的其他GPU和renderer进程就直接向crashpad-handler进程注册。

在crashpad-handler进程里面,根据它进程类型,它运行的是RunAsCrashpadHandler里面的逻辑,最终调用crashpad::HandlerMain里面。而crashpad::HandlerMain则创建了ExceptionHandlerServer、CrashReportExceptionHandler、CrashReportDatabase等对象。

发表评论

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