Chromium Trace and Perfetto使用详解
1. Trace
chromium 在 base 库中提供了 base::trace_event::TraceLog 类,该类是 TRACE_EVENT* , TRACE_COUNTER* 等宏的底层实现,关于这些宏定义见 base/trace_event/common/trace_event_common.h 。
使用 TraceLog 的流程:
- 创建 TraceLog 的 配置 TraceConfig;
- 开启 TraceLog:
base::trace_event::TraceLog::GetInstance()->SetEnabled(...); - 使用
TRACE_EVENT*等宏记录 Trace:TRACE_EVENT0("test", "main"); - 如果配置了输出到 console, 则不需要后续步骤了;
- 如果想要在程序中获取到 Trace 的结果可以使用:
base::trace_event::TraceLog::GetInstance()->Flush(...);
当使用 TRACE_EVENT(...) 来记录 Trace 时,默认情况下 Trace 数据会记录到 TraceLog::logged_events_ 中,流程如下:

TraceLog 只支持将 Trace 输出到 console 或者返回给到程序中,不支持写文件或者多进程,但是它提供了 hook 接口 base::trace_event::TraceLog::SetAddTraceEventOverrides() , 允许外部 hook trace 的流程,从而实现自己的处理。在 chromium 中就使用了这种方式来支持多进程的 Trace。 如果有注册 trace hook,则在 TraceLog::AddTraceEventWithThreadIdAndTimestamp 中会将数据发给之前注册的 hook。
当用户调用 Flush 的时候会将 TraceLog::logged_events_ 中的数据转换为 json, 处理流程如下:

直接使用 TraceLog 的 demo 见 demo_tracing_console.cc
2. TracingService/Perfetto
chromium 使用 TraceLog 的 hook 机制扩展了 TraceLog, 如果程序启动时添加了 --trace-startup=... 参数或者通过 chrome://tracing 来启动 trace,则会向 TraceLog 注册 3 个 TraceLog 的回调, TraceEventDataSource::OnAddTraceEvent, TraceEventDataSource::FlushCurrentThread, TraceEventDataSource::OnUpdateDuration,流程如下:

注册 hook 后,所有新的 Trace 都会被发送给 hook 函数,也就是 tracing::TraceEventDataSource 类,这个类由 //services/tracing 服务提供,用来将 TraceLog 对接到 Perfetto 。 Perfetto 是一个跨平台的 tracing 组件,包括一个可嵌入到其他程序中的 tracing 库以及用来可视化展示 trace 的工具 (https://ui.perfetto.dev/#!/和<chrome://tracing>)。 关于 Perfetto 的详细信息见 https://perfetto.dev/#/.
在 chromium 中,Perfetto 被包装进 TracingService,以便支持多进程的 Trace 追踪,TracingService 的代码在 //services/tracing 目录中。 直接使用 TracingService 的 demo 见 demo_tracing_perfetto.cc 。
下面的类图反应了 TracingService 是如何支持多进程的:

本来 Perfetto 也是支持多进程的,但是是使用自己定义的 IPC 通信,chromium 使用 mojo 替换掉了原本的 IPC 机制,以便让它更贴近 chromium, 并且可以支持 chromium 的沙箱机制。
3. Trace Viewer
获取到的 Trace 数据可以使用 TraceViewer 进行可视化,在 chromium 中使用 --trace-startup=... 或者 chrome://tracing 来获得 Trace 文件后可以使用 chrome://tracing 或者 https://ui.perfetto.dev/#!/ 来查看。 这两个 Trace Viewer 不仅支持 json 格式的 Trace 文件也支持 Android systrace 和 ftrace 格式。
如果你想使用 TraceViewer 但是又不想引入 Perfetto 的库,可以自己将数据生成为 chrome json trace event 格式,在 base 库中以及 swiftshader 中都采用了这种方式,因为这种 trace 数据格式并不复杂,例如以下格式就是合法的 Trace 格式:

TraceViewer 的一个例子:

4. TracingService 的执行流程追踪
启动 TracingService 的时候会同时启动 TraceLog,如下:

首次收到 Trace,初始化 TraceWriter 用于记录 Trace:

将 Trace 保存到 TraceWriter:

结束 TracingSerivce 的时候会将 Trace 的结果转换为 Json 格式:

5. 参考资料

Chromium Trace and Perfetto使用详解的更多相关文章
- SQL Server 默认跟踪(Trace)捕获事件详解
SQL Server 默认跟踪 -- 捕获事件详解 哪些具体事件默认跟踪文件能够捕获到? --returns full list of events SELECT * FROM sys.trace_e ...
- [转]keil使用详解
第一节 系统概述 Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上.结构性.可读性.可维护性上有明显的优势,因而易学易用.用过 ...
- linux查看端口及端口详解
今天现场查看了TCP端口的占用情况,如下图 红色部分是IP,现场那边问我是不是我的程序占用了tcp的链接,,我远程登陆现场查看了一下,这种类型的tcp链接占用了400多个,,后边查了一下资料,说E ...
- DNS解析过程详解
先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址www.baidu.com在配置当中应该是www.baidu.com.(最后有一点),一般我们在浏览器里输入时会省略后面的点 ...
- HTTP协议详解(转)
转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...
- HTTP请求方法详解
HTTP请求方法详解 请求方法:指定了客户端想对指定的资源/服务器作何种操作 下面我们介绍HTTP/1.1中可用的请求方法: [GET:获取资源] GET方法用来请求已被URI识别的资源.指定 ...
- HTTP协议详解
Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...
- WebConfig配置文件详解
今天看到博客园一位朋友整理的一个WebConfig配置文件详解,觉得不错,转载一下: <?xml version="1.0"?> <!--注意: 除了手动编辑此文 ...
- logback配置详解3<filter>
logback 常用配置详解(三) <filter> <filter>: 过滤器,执行一个过滤器会有返回个枚举值,即DENY,NEUTRAL,ACCEPT其中之一.返回DENY ...
- ASP.NET知识总结(3.HTTP协议详解)
引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...
随机推荐
- maven报错:不再支持源选项 5。请使用 6 或更高版本
问题描述 在执行命令 mvn compile 发生错误 D:\Github_NOTES\JavaWeb_Learning\02Java\JavaWeb\Code\Maven1>mvn clean ...
- sql中当关联查询主表很大影响查询速度时怎么办?
sql中当关联查询主表很大时,直接关联,查询速度会较慢,这时可以先利用子查询经筛选条件筛除一部数据,这样主连接表体量减少,这样能一定程度加快速度. (1)常规join -- 最慢7.558s sele ...
- 「学习笔记」FHQ-treap
FHQ-treap,即无旋 treap,又称分裂合并 treap,支持维护序列,可持久化等特性. FHQ-treap 有两个核心操作,分裂 与 合并.通过这两个操作,在很多情况下可以比旋转 treap ...
- .net通用RSA加密工具类
目前最流行的加密算法莫过于RSA了,以下是我们.net/.net core C#生成环境用的RSA加密工具类,在此分享给大家. using System; using System.IO; using ...
- 快速掌握Vue3:速成Vue3前端开发看这篇就够啦
一.Vue基本概念 1.1-Vue3的优点 Vue3支持Vue2额大多数特性. 更好的支持TypeScript. 打包大小减少41%. 初次渲染快55%,更新渲染快133%. 内存减少54%. 使用p ...
- 线性关系和非线性关系在.net中的应用
在数学中,线性关系和非线性关系是描述两个变量之间函数关系的两种不同类型. 线性关系是指两个变量之间可以用一条直线来表示的关系.具体来说,如果存在一个一次函数 y = kx + b,其中k和b是常数,使 ...
- [python]格式化字符串的几种方式
目录 方式一:C风格%操作符 方式二:内置的format函数与str类的format方法 方式三:插值格式字符串 python中有以下几种方法可以格式化字符串 方式一:C风格%操作符 这种方法偏C语言 ...
- [go笔记]websocket入门
简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议.WebSocket让客户端和服务端之间的数据交换变得非常简单,且允许服务器主动向客户端推送数据,并且之后客户端和服务端所有的通信都 ...
- 9.1 C++ STL 排序、算数与集合
C++ STL(Standard Template Library)是C++标准库中的一个重要组成部分,提供了丰富的模板函数和容器,用于处理各种数据结构和算法.在STL中,排序.算数和集合算法是常用的 ...
- 2023-09-01:用go语言编写。给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1, b2, ... ,bn }。 你需要求出其有多少个区间[L,R]
2023-09-01:用go语言编写.给出两个长度均为n的数组, A = { a1, a2, ... ,an }, B = { b1, b2, ... ,bn }. 你需要求出其有多少个区间[L,R] ...