利用Tracing阅读Chromium代码

Chromium中的Tracing工具可以记录每个函数的执行时间,是用来诊断浏览器性能问题的工具。它还有一个意想不到的用处,就是帮我们理解Chromium的代码,因为Tracing会把调用过的函数按照时间轴输出出来,通过Tracing的图形化界面,可以很清楚的明白对象函数之间的调用关系。

components/tracing/tracing_switches.cc代码文件的注释很清楚了介绍了Tracing命令行参数的用法:

另外在trace-startup、trace-shutdown里面可以设置记录的Tracing类别,比如–trace-startup=base,net,就只会记录base和net类别的Tracing。

比如把以下命令行参数传递给浏览器:

--trace-startup=browser,content,input,renderer,renderer_host,startup,ui --trace-startup-file=tracing.json --trace-startup-duration=10

它会记录浏览器启动的时候的Tracing信息,包含browser、content、input、renderer、renderer_host、startup、ui类别,记录10秒的数据,并把数据保存到tracing.json文件中。

然后浏览器地址栏中输入chrome://tracing/,点击左上角的Load按钮,加载我们生成的tracing.json数据文件,然后浏览器就会把数据以图形的样式展现给我们,如下图所示: use tracing to understand chromium

图中清楚显示了浏览器启动时做的各种初始化的工作,以及各种工作的先后次序。

Tracing中的数据是根据代码中的TRACE_EVENT宏收集到的:

bool StartupBrowserCreator::ProcessCmdLineImpl(
    const base::CommandLine& command_line,
    const base::FilePath& cur_dir,
    bool process_startup,
    Profile* last_used_profile,
    const Profiles& last_opened_profiles,
    StartupBrowserCreator* browser_creator) {
  DCHECK_CURRENTLY_ON(BrowserThread::UI);
  TRACE_EVENT0("startup", "StartupBrowserCreator::ProcessCmdLineImpl");

我们也可以增进自己的数据,宏的第一个参数是类别。