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_EVENT服务器托管网0("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/#!/和)。 关于 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. 参考资料
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
马尔可夫链中的期望问题 这个问题是我在做 [ZJOI2013] 抛硬币 – 洛谷 这道题的时候了解的一个概念。 在网上也只找到了一篇相关的内容:# 马尔可夫链中的期望问题 故在这里来分享一下其中的期望问题。 目录 马尔可夫链中的期望问题 马尔可夫链概率转移矩阵…