100#define TRACE_IOC_MAGIC 'T'
101#define TRACE_START _IO(TRACE_IOC_MAGIC, 1)
102#define TRACE_STOP _IO(TRACE_IOC_MAGIC, 2)
103#define TRACE_RESET _IO(TRACE_IOC_MAGIC, 3)
104#define TRACE_DUMP _IO(TRACE_IOC_MAGIC, 4)
105#define TRACE_SET_MASK _IO(TRACE_IOC_MAGIC, 5)
107#define TRACE_USR_MAX_PARAMS 3
111 uintptr_t params[TRACE_USR_MAX_PARAMS];
116 printf(
"\nUsage: ./trace [start] Start to trace events.\n");
117 printf(
"\nUsage: ./trace [stop] Stop trace.\n");
118 printf(
"\nUsage: ./trace [reset] Clear the trace record buffer.\n");
119 printf(
"\nUsage: ./trace [dump 0/1] Format printf trace data,"
120 "0/1 stands for whether to send data to studio for analysis.\n");
121 printf(
"\nUsage: ./trace [mask num] Set trace filter event mask.\n");
122 printf(
"\nUsage: ./trace [read nBytes] Read nBytes raw data from trace buffer.\n");
123 printf(
"\nUsage: ./trace [write type id params..] Write a user event, no more than 3 parameters.\n");
134 char *buffer = (
char *)
malloc(size);
135 if (buffer == NULL) {
136 printf(
"Read buffer malloc failed.\n");
140 len = read(fd, buffer, size);
141 for (i = 0; i < len; i++) {
142 printf(
"%02x ", buffer[i] & 0xFF);
152 info.
eventType = strtoul(argv[2], NULL, 0);
153 info.
identity = strtoul(argv[3], NULL, 0);
155 int paramNum = (argc - 4) > TRACE_USR_MAX_PARAMS ? TRACE_USR_MAX_PARAMS : (argc - 4);
157 for (i = 0; i < paramNum; i++) {
159 info.
params[i] = strtoul(argv[4 + i], NULL, 0);
192 int fd = open(
"/dev/trace", O_RDWR);
194 printf(
"Trace open failed.\n");
200 }
else if (argc == 2 && strcmp(argv[1],
"start") == 0) {
201 ioctl(fd, TRACE_START, NULL);
202 }
else if (argc == 2 && strcmp(argv[1],
"stop") == 0) {
203 ioctl(fd, TRACE_STOP, NULL);
204 }
else if (argc == 2 && strcmp(argv[1],
"reset") == 0) {
205 ioctl(fd, TRACE_RESET, NULL);
206 }
else if (argc == 3 && strcmp(argv[1],
"mask") == 0) {
207 size_t mask = strtoul(argv[2], NULL, 0);
208 ioctl(fd, TRACE_SET_MASK, mask);
209 }
else if (argc == 3 && strcmp(argv[1],
"dump") == 0) {
210 size_t flag = strtoul(argv[2], NULL, 0);
211 ioctl(fd, TRACE_DUMP, flag);
212 }
else if (argc == 3 && strcmp(argv[1],
"read") == 0) {
213 size_t size = strtoul(argv[2], NULL, 0);
215 }
else if (argc >= 4 && strcmp(argv[1],
"write") == 0) {
218 printf(
"Unsupported trace command.\n");
static void TraceRead(int fd, size_t size)
int main(int argc, char **argv)
main 用户态示例代码功能如下:
static void TraceWrite(int fd, int argc, char **argv)
static void TraceUsage(void)
void * malloc(size_t size)
动态分配内存块大小
void free(void *ptr)
释放ptr所指向的内存空间
uintptr_t params[TRACE_USR_MAX_PARAMS]
ARG_NUM_3 ARG_NUM_1 ARG_NUM_2 ARG_NUM_2 ARG_NUM_3 ARG_NUM_1 ARG_NUM_4 ARG_NUM_2 ARG_NUM_2 ARG_NUM_5 ARG_NUM_2 void