Trace
基本概念
Trace是内核提供的一个跟踪模块关键流程的功能框架,各个模块根据机制需要,可以在关键位置通过Trace进行相关信息记录,再通过文件或者其他方式导出,对数据进行分析。
Trace的记录要求:
- 需要尽快的完成信息记录,对系统时序的影响降低到最小;
- 需要尽可能的用小的空间存储大的数据量,减少内存消耗。
运行机制
在内核启动初期完成Trace功能的初始化,并且在支持Trace功能的模块进行初始化时,完成模块相应的Trace类型及回调函数的注册,触发Trace记录的trace point的具体位置可由各模块自行决定。
当系统触发到一个trace point时,Trace模块会对输入信息进行封装,添加Trace帧头信息,包含Trace类型、运行的cpuid、运行的任务id、运行的相对时间戳以及运行的进程id;再将trace frame记录到预先申请好的循环buffer中。
如果循环buffer记录的frame过多则可能出现翻转,会覆盖之前的记录,故保持记录的信息始终是最新的信息。Trace循环buffer的数据可以通过文件dump等形式导出进行详细分析,导出信息已按照时间戳信息完成排序。
使用指导
- 配置Trace控制宏LOSCFG_KERNEL_TRACE,默认关,通过在menuconfig内核配置"Kernel->Enable Trace Feature"中打开。
- 内核启动完成Trace初始化,对应接口OsTraceInit。
- 统一在los_trace_frame.h定义模块内traceframe结构体,并在los_trace_frame.c中实现模块Trace回调函数的实现。
- 需要跟踪的模块在初始化或者更早阶段完成Trace注册,对应接口LOS_TraceReg。
- 在需要开始跟踪的位置打开Trace开关进行记录,结束的位置关闭Trace开关停止记录。
- 通过LOS_Trace2File接口导出到文件。
- 根据帧头及帧体数据结构,对数据进行二次分析。
接口说明
OpenHarmony LiteOS-A内核的Trace框架提供下面几种功能,接口详细信息可以查看API参考。
表 1 Trace接口说明
说明:
- frame buffer是个循环buffer,如果记录过长时间会覆盖旧的信息,该buffer的大小可以在los_config.h中LOS_TRACE_BUFFER_SIZE宏配置,默认配置512KiB。
- 尽管Trace已经尽快的完成了组装及记录,但是仍旧会对系统整体性能产生不可避免的影响。
- Trace支持多个模块的Trace同时记录,根据需要开关各个模块的Trace,有助于降低数据分析量。
- 当前内核的task、memory、liteipc模块支持Trace记录功能。