更新时间:2021-07-08 GMT+08:00
分享

开发指导

使用场景

  • 通过Trace了解系统运转的轨迹,理解系统。
  • 通过Trace分析系统发生异常前的操作,定位死机问题。

功能

Huawei LiteOS的Trace模块为用户提供下面几种功能,接口详细信息可以查看API参考。

表1 功能列表

功能分类

接口名

描述

配置Trace缓冲区

LOS_TraceInit

配置Trace缓冲区的地址和大小

开启/停止Trace事件记录

LOS_TraceStart

开启事件记录

LOS_TraceStop

停止事件记录

操作Trace记录的数据

LOS_TraceRecordDump

输出Trace缓冲区数据

LOS_TraceRecordGet

获取Trace缓冲区的首地址

LOS_TraceReset

清除Trace缓冲区中的事件

过滤Trace记录的模块

LOS_TraceEventMaskSet

设置事件掩码,仅记录某些模块的事件

屏蔽某些中断号事件

LOS_TraceHwiFilterHookReg

注册过滤特定中断号事件的钩子函数

插桩函数

LOS_TRACE_EASY

简易插桩

LOS_TRACE

标准插桩

  1. LOS_TRACE_EASY(TYPE, IDENTITY, params...) 简易插桩。
    • 一句话插桩,用户在目标源代码中插入该接口即可。
    • TYPE有效取值范围为[0, 0xF],表示不同的事件类型。
    • IDENTITY类型UINTPTR,表示事件操作的主体对象。
    • Params类型UINTPTR,表示事件的参数。
    • 示例:
      LOS_TRACE_EASY(1, userId0, userParam1, userParam2);
      LOS_TRACE_EASY(2, userId0);
      LOS_TRACE_EASY(1, userId1, userParam1, userParam2);
      LOS_TRACE_EASY(2, userId1);

  1. LOS_TRACE(TYPE, IDENTITY, params...) 标准插桩。
    • 相比简易插桩,支持动态过滤事件和参数裁剪,但使用上需要用户按规则来扩展。
    • TYPE用于设置具体的事件类型,可以在头文件los_trace.h中的enum LOS_TRACE_TYPE中自定义事件类型。定义方法和规则可以参考其他事件类型。
    • IDENTITY和Params的类型及含义同简易插桩。
    • 示例:
      1.在enum LOS_TRACE_MASK中定义事件掩码,即模块级别的事件类型。定义规范为TRACE_#MOD#_FLAG,#MOD#表示模块名,例如:
        TRACE_FS_FLAG = 0x2000
      2.在enum LOS_TRACE_TYPE中定义具体事件类型。定义规范为#TYPE# = TRACE_#MOD#_FLAG | NUMBER,例如:
        FS_READ  = TRACE_FS_FLAG | 0; // 读文件
        FS_WRITE = TRACE_FS_FLAG | 1; // 写文件
      3.定义事件参数。定义规范为#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ...
        其中的#TYPE#就是上面2中的#TYPE#,例如:
        #define FS_READ_PARAMS(fp, fd, flag, size)    fp, fd, flag, size
        宏定义的参数对应于Trace缓冲区中记录的事件参数,用户可对任意参数字段进行裁剪;
        当定义为空时,表示不追踪该类型事件:
        #define FS_READ_PARAMS(fp, fd, flag, size) // 不追踪文件读事件
      4.在适当位置插入代码桩。定义规范为LOS_TRACE(#TYPE#, #TYPE#_PARAMS(IDENTITY, parma1...))
        LOS_TRACE(FS_READ, fp, fd, flag, size); // 读文件的代码桩,#TYPE#之后的入参就是上面3中的FS_READ_PARAMS函数的入参

  1. Huawei Liteos预置的Trace事件及参数均可以通过上述方式进行裁剪,参数详见kernel\include\los_trace.h。

Trace错误码

对Trace存在失败可能性的操作,包括初始化Trace、启动Trace 均需要返回对应的错误码,以便快速定位错误原因。其他无返回值的接口如停止Trace、清除与dump Trace 数据均为Trace状态不合法,系统会直接打印错误原因。

序号

定义

实际数值

描述

参考解决方案

1

LOS_ERRNO_TRACE_ERROR_STATUS

0x02001400

初始化Trace或启动Trace时状态不正确

禁止重复初始化Trace,未初始化Trace前禁止启动Trace

2

LOS_ERRNO_TRACE_NO_MEMORY

0x02001401

初始化Trace时,缓冲区申请失败

解决方案有两个:

  • 减小Trace缓冲区的大小,可以修改los_config.h中的LOS_TRACE_BUFFER_SIZE
  • 配置LOSCFG_BASE_CORE_TSK_LIMIT减少最大任务数

3

LOS_ERRNO_TRACE_BUF_TOO_SMALL

0x02001402

初始化Trace时,缓冲区size设置过小

增大Trace缓冲区的大小,可以修改los_config.h中的LOS_TRACE_BUFFER_SIZE

错误码定义见错误码简介。8~15位的所属模块为Trace模块,值为0x14。

开发流程

Trace的典型开发流程:

  1. 执行make menuconfig命令,进入Kernel ---> Enable Extend Kernel ---> Enable Trace Feature菜单,完成Trace的配置。

    配置项

    含义

    取值范围

    默认值

    依赖

    LOSCFG_KERNEL_TRACE

    Trace模块的裁剪开关

    YES/NO

    NO

    LOSCFG_KERNEL_EXTKERNEL

    LOSCFG_RECORDER_MODE_OFFLINE

    Trace工作模式为离线模式

    YES/NO

    YES

    LOSCFG_KERNEL_TRACE

    LOSCFG_RECORDER_MODE_ONLINE

    Trace工作模式为在线模式

    YES/NO

    NO

    LOSCFG_KERNEL_TRACE

    LOSCFG_TRACE_CLIENT_INTERACT

    使能与Trace IDE (Huawei LiteOS Studio)的交互,包括数据可视化和流程控制

    YES/NO

    NO

    LOSCFG_KERNEL_TRACE

    LOSCFG_TRACE_PIPELINE_SERIAL

    选择串口作为IDE数据可视化通道

    YES/NO

    YES

    LOSCFG_TRACE_CLIENT_INTERACT

    LOSCFG_TRACE_CONTROL_VIA_SHELL

    选择shell作为IDE流程控制的方式

    YES/NO

    YES

    LOSCFG_TRACE_CLIENT_INTERACT && LOSCFG_SHELL

    LOSCFG_TRACE_CONTROL_AGENT

    选择agent作为IDE流程控制的方式

    YES/NO

    NO

    LOSCFG_TRACE_CLIENT_INTERACT

    LOSCFG_TRACE_NO_CONTROL

    不启用IDE的流程控制

    YES/NO

    NO

    LOSCFG_TRACE_CLIENT_INTERACT

  2. (可选)预置事件参数和事件桩(或使用系统默认的事件参数配置和事件桩)。
  3. (可选)调用LOS_TraceStop停止Trace后,清除缓冲区LOS_TraceReset(系统默认已启动trace)。
  4. (可选)调用LOS_TraceEventMaskSet设置需要追踪的事件掩码(系统默认的事件掩码仅使能中断与任务切换)。
  5. 在需要记录事件的代码起始点调用LOS_TraceStart。
  6. 在需要记录事件的代码结束点调用LOS_TraceStop。
  7. 调用LOS_TraceRecordDump输出缓冲区数据(函数的入参为布尔型,FALSE表示格式化输出,TRUE表示输出到windows客户端)。

平台差异性

无。

分享:

    相关文档

    相关产品