系统调用
在 Linux 和 Android(仅限 userdebug 构建上)上,Perfetto 可以 trace 系统调用。
目前,只有系统调用号记录在 trace 中,参数不存储以限制 trace 大小开销。
在导入时,Trace Processor 使用内部系统调用映射表,目前支持 x86、x86_64、ArmEabi、aarch32 和 aarch64。这些表通过 extract_linux_syscall_tables 脚本生成。
UI
在 UI 级别,系统调用与每个线程的 Slice track 内联显示:

SQL
在 SQL 级别,系统调用与任何其他用户空间 Slice 事件没有什么不同。它们在每线程 Slice 堆栈中交错,可以通过查找 'sys_' 前缀轻松过滤:
select ts, dur, t.name as thread, s.name, depth from slices as s
left join thread_track as tt on s.track_id = tt.id
left join thread as t on tt.utid = t.utid
where s.name like 'sys_%'| ts | dur | thread | name |
|---|---|---|---|
| 856325324372751 | 439867648 | s.nexuslauncher | sys_epoll_pwait |
| 856325324376970 | 990 | FpsThrottlerThr | sys_recvfrom |
| 856325324378376 | 2657 | surfaceflinger | sys_ioctl |
| 856325324419574 | 1250 | android.anim.lf | sys_recvfrom |
| 856325324428168 | 27344 | android.anim.lf | sys_ioctl |
| 856325324451345 | 573 | FpsThrottlerThr | sys_getuid |
TraceConfig
data_sources: {
config {
name: "linux.ftrace"
ftrace_config {
ftrace_events: "raw_syscalls/sys_enter"
ftrace_events: "raw_syscalls/sys_exit"
}
}
}