1e41f4b71Sopenharmony_ci# Trace 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci## Basic Concepts 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ciTrace helps you learn about the kernel running process and the execution sequence of modules and tasks. With the information, you can better understand the code running process of the kernel and locate time sequence problems. 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci## Working Principles 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ciThe kernel provides a hook framework to embed hooks in the main process of each module. In the initial startup phase of the kernel, the trace function is initialized and the trace handlers are registered with the hooks. 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ciWhen a hook is triggered, the trace module encapsulates the input information and adds the trace frame header information, including the event type, ID of the running CPU, ID of the running task, and relative timestamp. 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ciThe trace module provides two working modes: offline mode and online mode. 16e41f4b71Sopenharmony_ci 17e41f4b71Sopenharmony_ciIn offline mode, trace frames are stored in a circular buffer. If too many frames are stored in the circular buffer, earlier frames will be overwritten to ensure that the information in the buffer is always the latest. Data in the circular buffer can be exported by running the shell command for further analysis. The exported information is sorted by timestamp. 18e41f4b71Sopenharmony_ci 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci 21e41f4b71Sopenharmony_ciThe online mode must be used with the integrated development environment (IDE). Trace frames are sent to the IDE in real time. The IDE parses the records and displays them in a visualized manner. 22e41f4b71Sopenharmony_ci 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci## Available APIs 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci 27e41f4b71Sopenharmony_ci### Kernel Mode 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ciThe trace module of the OpenHarmony LiteOS-A kernel provides the following APIs. For more details, see [API reference](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci**Table 1** APIs of the trace module 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci| Category| Description| 34e41f4b71Sopenharmony_ci| -------- | -------- | 35e41f4b71Sopenharmony_ci| Starting/Stopping trace| **LOS_TraceStart**: starts trace.<br>**LOS_TraceStop**: stops trace.| 36e41f4b71Sopenharmony_ci| Managing trace records| **LOS_TraceRecordDump**: dumps data from the trace buffer.<br>**LOS_TraceRecordGet**: obtains the start address of the trace buffer.<br>**LOS_TraceReset**: clears events in the trace buffer.| 37e41f4b71Sopenharmony_ci| Filtering trace records| **LOS_TraceEventMaskSet**: sets the event mask to trace only events of the specified modules.| 38e41f4b71Sopenharmony_ci| Masking events of specified interrupt IDs| **LOS_TraceHwiFilterHookReg**: registers a hook to filter out events of specified interrupt IDs.| 39e41f4b71Sopenharmony_ci| Performing function instrumentation| **LOS_TRACE_EASY**: performs simple instrumentation.<br>**LOS_TRACE**: performs standard instrumentation.| 40e41f4b71Sopenharmony_ci 41e41f4b71Sopenharmony_ci- You can perform function instrumentation in the source code to trace specific events. The system provides the following APIs for instrumentation: 42e41f4b71Sopenharmony_ci - **LOS_TRACE_EASY(TYPE, IDENTITY, params...)** for simple instrumentation 43e41f4b71Sopenharmony_ci - You only need to insert this API into the source code. 44e41f4b71Sopenharmony_ci - **TYPE** specifies the event type. The value range is 0 to 0xF. The meaning of each value is user-defined. 45e41f4b71Sopenharmony_ci - **IDENTITY** specifies the object of the event operation. The value is of the **UIntPtr** type. 46e41f4b71Sopenharmony_ci - **Params** specifies the event parameters. The value is of the **UIntPtr** type. 47e41f4b71Sopenharmony_ci Example: 48e41f4b71Sopenharmony_ci 49e41f4b71Sopenharmony_ci ``` 50e41f4b71Sopenharmony_ci Perform simple instrumentation for reading and writing files fd1 and fd2. 51e41f4b71Sopenharmony_ci Set TYPE to 1 for read operations and 2 for write operations. 52e41f4b71Sopenharmony_ci Insert the following to the position where the fd1 file is read: 53e41f4b71Sopenharmony_ci LOS_TRACE_EASY(1, fd1, flag, size); 54e41f4b71Sopenharmony_ci Insert the following to the position where the fd2 file is read: 55e41f4b71Sopenharmony_ci LOS_TRACE_EASY(1, fd2, flag, size); 56e41f4b71Sopenharmony_ci Insert the following to the position where the fd1 file is written: 57e41f4b71Sopenharmony_ci LOS_TRACE_EASY(2, fd1, flag, size); 58e41f4b71Sopenharmony_ci Insert the following in the position where the fd2 file is written: 59e41f4b71Sopenharmony_ci LOS_TRACE_EASY(2, fd2, flag, size); 60e41f4b71Sopenharmony_ci ``` 61e41f4b71Sopenharmony_ci - **LOS_TRACE(TYPE, IDENTITY, params...)** for standard instrumentation. 62e41f4b71Sopenharmony_ci - Compared with simple instrumentation, standard instrumentation supports dynamic event filtering and parameter tailoring. However, you need to extend the functions based on rules. 63e41f4b71Sopenharmony_ci - **TYPE** specifies the event type. You can define the event type in **enum LOS_TRACE_TYPE** in the header file **los_trace.h**. For details about methods and rules for defining events, see other event types. 64e41f4b71Sopenharmony_ci - The **IDENTITY** and **Params** are the same as those of simple instrumentation. 65e41f4b71Sopenharmony_ci Example: 66e41f4b71Sopenharmony_ci 67e41f4b71Sopenharmony_ci ``` 68e41f4b71Sopenharmony_ci 1. Set the event mask (module-level event type) in enum LOS_TRACE_MASK. 69e41f4b71Sopenharmony_ci Format: TRACE_#MOD#_FLAG (MOD indicates the module name) 70e41f4b71Sopenharmony_ci Example: 71e41f4b71Sopenharmony_ci TRACE_FS_FLAG = 0x4000 72e41f4b71Sopenharmony_ci 2. Define the event type in **enum LOS_TRACE_TYPE**. 73e41f4b71Sopenharmony_ci Format: #TYPE# = TRACE_#MOD#_FLAG | NUMBER 74e41f4b71Sopenharmony_ci Example: 75e41f4b71Sopenharmony_ci FS_READ = TRACE_FS_FLAG | 0; // Read files. 76e41f4b71Sopenharmony_ci FS_WRITE = TRACE_FS_FLAG | 1; // Write files. 77e41f4b71Sopenharmony_ci 3. Set event parameters in the #TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ... format. 78e41f4b71Sopenharmony_ci #TYPE# is the #TYPE# defined in step 2. 79e41f4b71Sopenharmony_ci Example: 80e41f4b71Sopenharmony_ci #define FS_READ_PARAMS(fp, fd, flag, size) fp, fd, flag, size 81e41f4b71Sopenharmony_ci The parameters defined by the macro correspond to the event parameters recorded in the trace buffer. You can modify the parameters as required. 82e41f4b71Sopenharmony_ci If no parameter is specified, events of this type are not traced. 83e41f4b71Sopenharmony_ci #define FS_READ_PARAMS(fp, fd, flag, size) // File reading events are not traced. 84e41f4b71Sopenharmony_ci 4. Insert a code stub in a proper position. 85e41f4b71Sopenharmony_ci Format: LOS_TRACE(#TYPE#, #TYPE#_PARAMS(IDENTITY, parma1...)) 86e41f4b71Sopenharmony_ci LOS_TRACE(FS_READ, fp, fd, flag, size); // Code stub for reading files. 87e41f4b71Sopenharmony_ci #The parameters following #TYPE# are the input parameter of the **FS_READ_PARAMS** function in step 3. 88e41f4b71Sopenharmony_ci ``` 89e41f4b71Sopenharmony_ci 90e41f4b71Sopenharmony_ci > **NOTE**<br> 91e41f4b71Sopenharmony_ci > The preset trace events and parameters can be tailored in the same way. For details about the parameters, see [kernel\include\los_trace.h](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci- For **LOS_TraceEventMaskSet(UINT32 mask)**, only the most significant 28 bits (corresponding to the enable bit of the module in **LOS_TRACE_MASK**) of the mask take effect and are used only for module-based tracing. Currently, fine-grained event-based tracing is not supported. For example, in **LOS_TraceEventMaskSet(0x202)**, the effective mask is **0x200 (TRACE_QUE_FLAG)** and all events of the QUE module are collected. The recommended method is **LOS_TraceEventMaskSet(TRACE_EVENT_FLAG | TRACE_MUX_FLAG | TRACE_SEM_FLAG | TRACE_QUE_FLAG);**. 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci- To enable trace of only simple instrumentation events, set **Trace Mask** to **TRACE_MAX_FLAG**. 96e41f4b71Sopenharmony_ci 97e41f4b71Sopenharmony_ci- The trace buffer has limited capacity. When the trace buffer is full, events will be overwritten. You can use **LOS_TraceRecordDump** to export data from the trace buffer and locate the latest records by **CurEvtIndex**. 98e41f4b71Sopenharmony_ci 99e41f4b71Sopenharmony_ci- The typical trace operation process includes **LOS_TraceStart**, **LOS_TraceStop**, and **LOS_TraceRecordDump**. 100e41f4b71Sopenharmony_ci 101e41f4b71Sopenharmony_ci- You can filter out interrupt events by interrupt ID to prevent other events from being overwritten due to frequent triggering of a specific interrupt in some scenarios. You can customize interrupt filtering rules. 102e41f4b71Sopenharmony_ci Example: 103e41f4b71Sopenharmony_ci 104e41f4b71Sopenharmony_ci ```c 105e41f4b71Sopenharmony_ci BOOL Example_HwiNumFilter(UINT32 hwiNum) 106e41f4b71Sopenharmony_ci { 107e41f4b71Sopenharmony_ci if ((hwiNum == TIMER_INT) || (hwiNum == DMA_INT)) { 108e41f4b71Sopenharmony_ci return TRUE; 109e41f4b71Sopenharmony_ci } 110e41f4b71Sopenharmony_ci return FALSE; 111e41f4b71Sopenharmony_ci } 112e41f4b71Sopenharmony_ci LOS_TraceHwiFilterHookReg(Example_HwiNumFilter); 113e41f4b71Sopenharmony_ci ``` 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_ciThe interrupt events with interrupt ID of **TIMER_INT** or **DMA_INT** are not traced. 116e41f4b71Sopenharmony_ci 117e41f4b71Sopenharmony_ci 118e41f4b71Sopenharmony_ci### User Mode 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ciThe trace character device is added in **/dev/trace**. You can use **read()**, **write()**, and **ioctl()** on the device node to read, write, and control trace in user mode. 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci- **read()**: reads the trace data in user mode. 123e41f4b71Sopenharmony_ci 124e41f4b71Sopenharmony_ci- **write()**: writes an event in user mode. 125e41f4b71Sopenharmony_ci 126e41f4b71Sopenharmony_ci- **ioctl()**: performs user-mode trace operations, including: 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci 129e41f4b71Sopenharmony_ci```c 130e41f4b71Sopenharmony_ci#define TRACE_IOC_MAGIC 'T' 131e41f4b71Sopenharmony_ci#define TRACE_START _IO(TRACE_IOC_MAGIC, 1) 132e41f4b71Sopenharmony_ci#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2) 133e41f4b71Sopenharmony_ci#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3) 134e41f4b71Sopenharmony_ci#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4) 135e41f4b71Sopenharmony_ci#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5) 136e41f4b71Sopenharmony_ci``` 137e41f4b71Sopenharmony_ci 138e41f4b71Sopenharmony_ciThe operations specified by the input parameter of **ioctl()** correspond to **LOS_TraceStart**, **LOS_TraceStop**, **LOS_TraceReset**, **LOS_TraceRecordDump**, and **LOS_TraceEventMaskSet**, respectively. 139e41f4b71Sopenharmony_ci 140e41f4b71Sopenharmony_ciFor details, see [User-Mode Development Example](kernel-small-debug-trace.md#user-mode). 141e41f4b71Sopenharmony_ci 142e41f4b71Sopenharmony_ci 143e41f4b71Sopenharmony_ci## Development Guidelines 144e41f4b71Sopenharmony_ci 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci### Kernel-Mode Development Process 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ciThe typical trace process is as follows: 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci1. Configure the macro related to the trace module. 151e41f4b71Sopenharmony_ci Configure the macro **LOSCFG_KERNEL_TRACE**, which is disabled by default. Run the **make update_config** command in the **kernel/liteos_a** directory, choose **Kernel** > **Enable Hook Feature**, and set **Enable Trace Feature** to **YES**. 152e41f4b71Sopenharmony_ci 153e41f4b71Sopenharmony_ci | Item| menuconfig Option| Description| Value| 154e41f4b71Sopenharmony_ci | -------- | -------- | -------- | -------- | 155e41f4b71Sopenharmony_ci | LOSCFG_KERNEL_TRACE | Enable Trace Feature | Specifies whether to enable the trace feature.| YES/NO | 156e41f4b71Sopenharmony_ci | LOSCFG_RECORDER_MODE_OFFLINE | Trace work mode -> Offline mode | Specifies whether to enable the online trace mode.| YES/NO | 157e41f4b71Sopenharmony_ci | LOSCFG_RECORDER_MODE_ONLINE | Trace work mode -> Online mode | Specifies whether to enable the offline trace mode.| YES/NO | 158e41f4b71Sopenharmony_ci | LOSCFG_TRACE_CLIENT_INTERACT | Enable Trace Client Visualization and Control | Enables interaction with Trace IDE (dev tools), including data visualization and process control.| YES/NO | 159e41f4b71Sopenharmony_ci | LOSCFG_TRACE_FRAME_CORE_MSG | Enable Record more extended content -> Record cpuid, hardware interrupt status, task lock status | Specifies whether to enable recording of the CPU ID, interruption state, and lock task state.| YES/NO | 160e41f4b71Sopenharmony_ci | LOSCFG_TRACE_FRAME_EVENT_COUNT | Enable Record more extended content -> Record event count, which indicate the sequence of happend events | Specifies whether to enables recording of the event sequence number.| YES/NO | 161e41f4b71Sopenharmony_ci | LOSCFG_TRACE_FRAME_MAX_PARAMS | Record max params | Specifies the maximum number of parameters for event recording.| INT | 162e41f4b71Sopenharmony_ci | LOSCFG_TRACE_BUFFER_SIZE | Trace record buffer size | Specifies the trace buffer size.| INT | 163e41f4b71Sopenharmony_ci 164e41f4b71Sopenharmony_ci2. (Optional) Preset event parameters and stubs (or use the default event parameter settings and event stubs). 165e41f4b71Sopenharmony_ci 166e41f4b71Sopenharmony_ci3. (Optional) Call **LOS_TraceStop** to stop trace and call **LOS_TraceReset** to clear the trace buffer. (Trace is started by default.) 167e41f4b71Sopenharmony_ci 168e41f4b71Sopenharmony_ci4. (Optional) Call **LOS_TraceEventMaskSet** to set the mask of the events to be traced. The default event mask enables only trace of interrupts and task events. For details about the event masks, see **LOS_TRACE_MASK** in [los_trace.h](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 169e41f4b71Sopenharmony_ci 170e41f4b71Sopenharmony_ci5. Call **LOS_TraceStart** at the start of the code where the event needs to be traced. 171e41f4b71Sopenharmony_ci 172e41f4b71Sopenharmony_ci6. Call **LOS_TraceStop** at the end of the code where the event needs to be traced. 173e41f4b71Sopenharmony_ci 174e41f4b71Sopenharmony_ci7. Call **LOS_TraceRecordDump** to output the data in the buffer. (The input parameter of the function is of the Boolean type. The value **FALSE** means to output data in the specified format, and the value **TRUE** means to output data to Trace IDE.) 175e41f4b71Sopenharmony_ci 176e41f4b71Sopenharmony_ciThe methods in steps 3 to 7 are encapsulated with shell commands. You can run these commands on shell. The mappings between the methods and commands are as follows: 177e41f4b71Sopenharmony_ci 178e41f4b71Sopenharmony_ci- LOS_TraceReset —— trace_reset 179e41f4b71Sopenharmony_ci 180e41f4b71Sopenharmony_ci- LOS_TraceEventMaskSet —— trace_mask 181e41f4b71Sopenharmony_ci 182e41f4b71Sopenharmony_ci- LOS_TraceStart —— trace_start 183e41f4b71Sopenharmony_ci 184e41f4b71Sopenharmony_ci- LOS_TraceStop —— trace_stop 185e41f4b71Sopenharmony_ci 186e41f4b71Sopenharmony_ci- LOS_TraceRecordDump —— trace_dump 187e41f4b71Sopenharmony_ci 188e41f4b71Sopenharmony_ci 189e41f4b71Sopenharmony_ci### Kernel-Mode Development Example 190e41f4b71Sopenharmony_ci 191e41f4b71Sopenharmony_ciThis example implements the following: 192e41f4b71Sopenharmony_ci 193e41f4b71Sopenharmony_ci1. Create a trace task. 194e41f4b71Sopenharmony_ci 195e41f4b71Sopenharmony_ci2. Set the event mask. 196e41f4b71Sopenharmony_ci 197e41f4b71Sopenharmony_ci3. Start trace. 198e41f4b71Sopenharmony_ci 199e41f4b71Sopenharmony_ci4. Stop trace. 200e41f4b71Sopenharmony_ci 201e41f4b71Sopenharmony_ci5. Output trace data in the specified format. 202e41f4b71Sopenharmony_ci 203e41f4b71Sopenharmony_ci 204e41f4b71Sopenharmony_ci### Kernel-Mode Sample Code 205e41f4b71Sopenharmony_ci 206e41f4b71Sopenharmony_ciYou can add the test function of the sample code to **TestTaskEntry** in **kernel/liteos_a/testsuites /kernel /src/osTest.c** for testing. 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ciThe sample code is as follows: 209e41f4b71Sopenharmony_ci 210e41f4b71Sopenharmony_ci 211e41f4b71Sopenharmony_ci```c 212e41f4b71Sopenharmony_ci#include "los_trace.h" 213e41f4b71Sopenharmony_ciUINT32 g_traceTestTaskId; 214e41f4b71Sopenharmony_ciVOID Example_Trace(VOID) 215e41f4b71Sopenharmony_ci{ 216e41f4b71Sopenharmony_ci UINT32 ret; 217e41f4b71Sopenharmony_ci LOS_TaskDelay(10); 218e41f4b71Sopenharmony_ci /* Start trace. */ 219e41f4b71Sopenharmony_ci ret = LOS_TraceStart(); 220e41f4b71Sopenharmony_ci if (ret != LOS_OK) { 221e41f4b71Sopenharmony_ci dprintf("trace start error\n"); 222e41f4b71Sopenharmony_ci return; 223e41f4b71Sopenharmony_ci } 224e41f4b71Sopenharmony_ci /* Trigger a task switching event. */ 225e41f4b71Sopenharmony_ci LOS_TaskDelay(1); 226e41f4b71Sopenharmony_ci LOS_TaskDelay(1); 227e41f4b71Sopenharmony_ci LOS_TaskDelay(1); 228e41f4b71Sopenharmony_ci /* Stop trace. */ 229e41f4b71Sopenharmony_ci LOS_TraceStop(); 230e41f4b71Sopenharmony_ci LOS_TraceRecordDump(FALSE); 231e41f4b71Sopenharmony_ci} 232e41f4b71Sopenharmony_ciUINT32 Example_Trace_test(VOID) 233e41f4b71Sopenharmony_ci{ 234e41f4b71Sopenharmony_ci UINT32 ret; 235e41f4b71Sopenharmony_ci TSK_INIT_PARAM_S traceTestTask; 236e41f4b71Sopenharmony_ci /* Create a trace task. */ 237e41f4b71Sopenharmony_ci memset(&traceTestTask, 0, sizeof(TSK_INIT_PARAM_S)); 238e41f4b71Sopenharmony_ci traceTestTask.pfnTaskEntry = (TSK_ENTRY_FUNC)Example_Trace; 239e41f4b71Sopenharmony_ci traceTestTask.pcName = "TestTraceTsk"; /* Test task name. */ 240e41f4b71Sopenharmony_ci traceTestTask.uwStackSize = 0x800; // 0x800: trace test task stack size 241e41f4b71Sopenharmony_ci traceTestTask.usTaskPrio = 5; // 5: trace test task priority 242e41f4b71Sopenharmony_ci traceTestTask.uwResved = LOS_TASK_STATUS_DETACHED; 243e41f4b71Sopenharmony_ci ret = LOS_TaskCreate(&g_traceTestTaskId, &traceTestTask); 244e41f4b71Sopenharmony_ci if (ret != LOS_OK) { 245e41f4b71Sopenharmony_ci dprintf("TraceTestTask create failed .\n"); 246e41f4b71Sopenharmony_ci return LOS_NOK; 247e41f4b71Sopenharmony_ci } 248e41f4b71Sopenharmony_ci /* Trace is started by default. Therefore, you can stop trace, clear the buffer, and then start trace. */ 249e41f4b71Sopenharmony_ci LOS_TraceStop(); 250e41f4b71Sopenharmony_ci LOS_TraceReset(); 251e41f4b71Sopenharmony_ci /* Enable trace of the Task module events. */ 252e41f4b71Sopenharmony_ci LOS_TraceEventMaskSet(TRACE_TASK_FLAG); 253e41f4b71Sopenharmony_ci return LOS_OK; 254e41f4b71Sopenharmony_ci} 255e41f4b71Sopenharmony_ciLOS_MODULE_INIT(Example_Trace_test, LOS_INIT_LEVEL_KMOD_EXTENDED); 256e41f4b71Sopenharmony_ci``` 257e41f4b71Sopenharmony_ci 258e41f4b71Sopenharmony_ci 259e41f4b71Sopenharmony_ci### Verification 260e41f4b71Sopenharmony_ci 261e41f4b71Sopenharmony_ciThe output is as follows: 262e41f4b71Sopenharmony_ci 263e41f4b71Sopenharmony_ci 264e41f4b71Sopenharmony_ci``` 265e41f4b71Sopenharmony_ci***TraceInfo begin*** 266e41f4b71Sopenharmony_ciclockFreq = 50000000 267e41f4b71Sopenharmony_ciCurEvtIndex = 7 268e41f4b71Sopenharmony_ciIndex Time(cycles) EventType CurTask Identity params 269e41f4b71Sopenharmony_ci0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 0x0 270e41f4b71Sopenharmony_ci1 0x366d74ae 0x45 0x0 0x1 0x0 0x8 0x1f 271e41f4b71Sopenharmony_ci2 0x36940da6 0x45 0x1 0xc 0x1f 0x4 0x9 272e41f4b71Sopenharmony_ci3 0x3694337c 0x45 0xc 0x1 0x9 0x8 0x1f 273e41f4b71Sopenharmony_ci4 0x36eea56e 0x45 0x1 0xc 0x1f 0x4 0x9 274e41f4b71Sopenharmony_ci5 0x36eec810 0x45 0xc 0x1 0x9 0x8 0x1f 275e41f4b71Sopenharmony_ci6 0x3706f804 0x45 0x1 0x0 0x1f 0x4 0x0 276e41f4b71Sopenharmony_ci7 0x37070e59 0x45 0x0 0x1 0x0 0x8 0x1f 277e41f4b71Sopenharmony_ci***TraceInfo end*** 278e41f4b71Sopenharmony_ci``` 279e41f4b71Sopenharmony_ci 280e41f4b71Sopenharmony_ciThe output event information includes the occurrence time, event type, task in which the event occurs, object of the event operation, and other parameters of the event. 281e41f4b71Sopenharmony_ci 282e41f4b71Sopenharmony_ci- **EventType**: type of the event. For details, see **enum LOS_TRACE_TYPE** in [los_trace.h](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 283e41f4b71Sopenharmony_ci 284e41f4b71Sopenharmony_ci- **CurrentTask**: ID of the running task. 285e41f4b71Sopenharmony_ci 286e41f4b71Sopenharmony_ci- **Identity**: object of the event operation. For details, see **\#TYPE\#_PARAMS** in [los_trace.h](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 287e41f4b71Sopenharmony_ci 288e41f4b71Sopenharmony_ci- **params**: event parameters. For details, see **\#TYPE\#_PARAMS** in [los_trace.h](https://gitee.com/openharmony/kernel_liteos_a/blob/master/kernel/include/los_trace.h). 289e41f4b71Sopenharmony_ci 290e41f4b71Sopenharmony_ciThe following uses output No. 0 as an example. 291e41f4b71Sopenharmony_ci 292e41f4b71Sopenharmony_ci 293e41f4b71Sopenharmony_ci``` 294e41f4b71Sopenharmony_ciIndex Time(cycles) EventType CurTask Identity params 295e41f4b71Sopenharmony_ci0 0x366d5e88 0x45 0x1 0x0 0x1f 0x4 296e41f4b71Sopenharmony_ci``` 297e41f4b71Sopenharmony_ci 298e41f4b71Sopenharmony_ci- **Time (cycles)** can be converted into time (in seconds) by dividing the cycles by clockFreq. 299e41f4b71Sopenharmony_ci 300e41f4b71Sopenharmony_ci- **0x45** indicates the task switching event. **0x1** is the ID of the task in running. 301e41f4b71Sopenharmony_ci 302e41f4b71Sopenharmony_ci- For details about the meanings of **Identity** and **params**, see the **TASK_SWITCH_PARAMS** macro. 303e41f4b71Sopenharmony_ci 304e41f4b71Sopenharmony_ci```c 305e41f4b71Sopenharmony_ci#define TASK_SWITCH_PARAMS(taskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus) \ 306e41f4b71Sopenharmony_citaskId, oldPriority, oldTaskStatus, newPriority, newTaskStatus 307e41f4b71Sopenharmony_ci``` 308e41f4b71Sopenharmony_ci 309e41f4b71Sopenharmony_ciBecause of **#TYPE#_PARAMS(IDENTITY, parma1...) IDENTITY, ...**, **Identity** is **taskId (0x0)** and the first parameter is **oldPriority (0x1f)**. 310e41f4b71Sopenharmony_ci 311e41f4b71Sopenharmony_ci> **NOTE** 312e41f4b71Sopenharmony_ci> 313e41f4b71Sopenharmony_ci> The number of parameters in **params** is specified by **LOSCFG_TRACE_FRAME_MAX_PARAMS**. The default value is **3**. Excess parameters are not recorded. You need to set **LOSCFG_TRACE_FRAME_MAX_PARAMS** based on service requirements. 314e41f4b71Sopenharmony_ci 315e41f4b71Sopenharmony_ciTask 0x1 is switched to Task 0x0. The priority of task 0x1 is **0x1f**, and the state is **0x4**. The priority of the task 0x0 is **0x0**. 316