xref: /aosp_15_r20/external/trace-cmd/tracecmd/trace-cmd.c (revision 58e6ee5f017f6a8912852c892d18457e4bafb554)
1*58e6ee5fSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*58e6ee5fSAndroid Build Coastguard Worker /*
3*58e6ee5fSAndroid Build Coastguard Worker  * Copyright (C) 2008, 2009, 2010 Red Hat Inc, Steven Rostedt <[email protected]>
4*58e6ee5fSAndroid Build Coastguard Worker  *
5*58e6ee5fSAndroid Build Coastguard Worker  */
6*58e6ee5fSAndroid Build Coastguard Worker #include <stdio.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <string.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
9*58e6ee5fSAndroid Build Coastguard Worker #include <unistd.h>
10*58e6ee5fSAndroid Build Coastguard Worker #include <dirent.h>
11*58e6ee5fSAndroid Build Coastguard Worker #include <errno.h>
12*58e6ee5fSAndroid Build Coastguard Worker #include <stdlib.h>
13*58e6ee5fSAndroid Build Coastguard Worker #include <sys/syscall.h>
14*58e6ee5fSAndroid Build Coastguard Worker 
15*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
16*58e6ee5fSAndroid Build Coastguard Worker 
17*58e6ee5fSAndroid Build Coastguard Worker int silence_warnings;
18*58e6ee5fSAndroid Build Coastguard Worker int show_status;
19*58e6ee5fSAndroid Build Coastguard Worker 
20*58e6ee5fSAndroid Build Coastguard Worker #ifndef gettid
21*58e6ee5fSAndroid Build Coastguard Worker #define gettid() syscall(__NR_gettid)
22*58e6ee5fSAndroid Build Coastguard Worker #endif
23*58e6ee5fSAndroid Build Coastguard Worker 
warning(const char * fmt,...)24*58e6ee5fSAndroid Build Coastguard Worker void warning(const char *fmt, ...)
25*58e6ee5fSAndroid Build Coastguard Worker {
26*58e6ee5fSAndroid Build Coastguard Worker 	va_list ap;
27*58e6ee5fSAndroid Build Coastguard Worker 
28*58e6ee5fSAndroid Build Coastguard Worker 	if (silence_warnings)
29*58e6ee5fSAndroid Build Coastguard Worker 		return;
30*58e6ee5fSAndroid Build Coastguard Worker 
31*58e6ee5fSAndroid Build Coastguard Worker 	if (errno)
32*58e6ee5fSAndroid Build Coastguard Worker 		perror("trace-cmd");
33*58e6ee5fSAndroid Build Coastguard Worker 	errno = 0;
34*58e6ee5fSAndroid Build Coastguard Worker 
35*58e6ee5fSAndroid Build Coastguard Worker 	va_start(ap, fmt);
36*58e6ee5fSAndroid Build Coastguard Worker 	fprintf(stderr, "  ");
37*58e6ee5fSAndroid Build Coastguard Worker 	vfprintf(stderr, fmt, ap);
38*58e6ee5fSAndroid Build Coastguard Worker 	va_end(ap);
39*58e6ee5fSAndroid Build Coastguard Worker 
40*58e6ee5fSAndroid Build Coastguard Worker 	fprintf(stderr, "\n");
41*58e6ee5fSAndroid Build Coastguard Worker }
42*58e6ee5fSAndroid Build Coastguard Worker 
malloc_or_die(unsigned int size)43*58e6ee5fSAndroid Build Coastguard Worker void *malloc_or_die(unsigned int size)
44*58e6ee5fSAndroid Build Coastguard Worker {
45*58e6ee5fSAndroid Build Coastguard Worker 	void *data;
46*58e6ee5fSAndroid Build Coastguard Worker 
47*58e6ee5fSAndroid Build Coastguard Worker 	data = malloc(size);
48*58e6ee5fSAndroid Build Coastguard Worker 	if (!data)
49*58e6ee5fSAndroid Build Coastguard Worker 		die("malloc");
50*58e6ee5fSAndroid Build Coastguard Worker 	return data;
51*58e6ee5fSAndroid Build Coastguard Worker }
52*58e6ee5fSAndroid Build Coastguard Worker 
tracecmd_debug(const char * fmt,...)53*58e6ee5fSAndroid Build Coastguard Worker void tracecmd_debug(const char *fmt, ...)
54*58e6ee5fSAndroid Build Coastguard Worker {
55*58e6ee5fSAndroid Build Coastguard Worker 	va_list ap;
56*58e6ee5fSAndroid Build Coastguard Worker 
57*58e6ee5fSAndroid Build Coastguard Worker 	if (!tracecmd_get_debug())
58*58e6ee5fSAndroid Build Coastguard Worker 		return;
59*58e6ee5fSAndroid Build Coastguard Worker 
60*58e6ee5fSAndroid Build Coastguard Worker 	va_start(ap, fmt);
61*58e6ee5fSAndroid Build Coastguard Worker 	printf("[%d] ", (int)gettid());
62*58e6ee5fSAndroid Build Coastguard Worker 	vprintf(fmt, ap);
63*58e6ee5fSAndroid Build Coastguard Worker 	va_end(ap);
64*58e6ee5fSAndroid Build Coastguard Worker }
65*58e6ee5fSAndroid Build Coastguard Worker 
66*58e6ee5fSAndroid Build Coastguard Worker static struct trace_log_severity {
67*58e6ee5fSAndroid Build Coastguard Worker 	int		id;
68*58e6ee5fSAndroid Build Coastguard Worker 	const char	*name;
69*58e6ee5fSAndroid Build Coastguard Worker } log_severity[] = {
70*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_NONE, .name = "none" },
71*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_CRITICAL, .name = "crit" },
72*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_ERROR, .name = "err" },
73*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_WARNING, .name = "warn" },
74*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_INFO, .name = "info" },
75*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_DEBUG, .name = "debug" },
76*58e6ee5fSAndroid Build Coastguard Worker 	{ .id = TEP_LOG_ALL, .name = "all" },
77*58e6ee5fSAndroid Build Coastguard Worker };
78*58e6ee5fSAndroid Build Coastguard Worker 
trace_set_verbose(char * level)79*58e6ee5fSAndroid Build Coastguard Worker int trace_set_verbose(char *level)
80*58e6ee5fSAndroid Build Coastguard Worker {
81*58e6ee5fSAndroid Build Coastguard Worker 	int id;
82*58e6ee5fSAndroid Build Coastguard Worker 
83*58e6ee5fSAndroid Build Coastguard Worker 	/* Default level is info */
84*58e6ee5fSAndroid Build Coastguard Worker 	if (!level)
85*58e6ee5fSAndroid Build Coastguard Worker 		level = "info";
86*58e6ee5fSAndroid Build Coastguard Worker 
87*58e6ee5fSAndroid Build Coastguard Worker 	if (isdigit(level[0])) {
88*58e6ee5fSAndroid Build Coastguard Worker 		id = atoi(level);
89*58e6ee5fSAndroid Build Coastguard Worker 		if (id >= TEP_LOG_NONE) {
90*58e6ee5fSAndroid Build Coastguard Worker 			if (id > TEP_LOG_ALL)
91*58e6ee5fSAndroid Build Coastguard Worker 				id = TEP_LOG_ALL;
92*58e6ee5fSAndroid Build Coastguard Worker 			tracecmd_set_loglevel(id);
93*58e6ee5fSAndroid Build Coastguard Worker 			return 0;
94*58e6ee5fSAndroid Build Coastguard Worker 		}
95*58e6ee5fSAndroid Build Coastguard Worker 	} else {
96*58e6ee5fSAndroid Build Coastguard Worker 		int size = ARRAY_SIZE(log_severity);
97*58e6ee5fSAndroid Build Coastguard Worker 		int i;
98*58e6ee5fSAndroid Build Coastguard Worker 
99*58e6ee5fSAndroid Build Coastguard Worker 		for (i = 0; i < size; i++) {
100*58e6ee5fSAndroid Build Coastguard Worker 			if (!strncmp(level, log_severity[i].name, strlen(log_severity[i].name))) {
101*58e6ee5fSAndroid Build Coastguard Worker 				tracecmd_set_loglevel(log_severity[i].id);
102*58e6ee5fSAndroid Build Coastguard Worker 				return 0;
103*58e6ee5fSAndroid Build Coastguard Worker 			}
104*58e6ee5fSAndroid Build Coastguard Worker 		}
105*58e6ee5fSAndroid Build Coastguard Worker 	}
106*58e6ee5fSAndroid Build Coastguard Worker 
107*58e6ee5fSAndroid Build Coastguard Worker 	return -1;
108*58e6ee5fSAndroid Build Coastguard Worker }
109*58e6ee5fSAndroid Build Coastguard Worker 
110*58e6ee5fSAndroid Build Coastguard Worker /**
111*58e6ee5fSAndroid Build Coastguard Worker  * struct command
112*58e6ee5fSAndroid Build Coastguard Worker  * @name command name
113*58e6ee5fSAndroid Build Coastguard Worker  * @run function to execute on command `name`
114*58e6ee5fSAndroid Build Coastguard Worker  */
115*58e6ee5fSAndroid Build Coastguard Worker struct command {
116*58e6ee5fSAndroid Build Coastguard Worker 	char *name;
117*58e6ee5fSAndroid Build Coastguard Worker 	void (*run)(int argc, char **argv);
118*58e6ee5fSAndroid Build Coastguard Worker };
119*58e6ee5fSAndroid Build Coastguard Worker 
120*58e6ee5fSAndroid Build Coastguard Worker 
121*58e6ee5fSAndroid Build Coastguard Worker /**
122*58e6ee5fSAndroid Build Coastguard Worker  * Lookup table that maps command names to functions
123*58e6ee5fSAndroid Build Coastguard Worker  */
124*58e6ee5fSAndroid Build Coastguard Worker struct command commands[] = {
125*58e6ee5fSAndroid Build Coastguard Worker 	{"report", trace_report},
126*58e6ee5fSAndroid Build Coastguard Worker 	{"snapshot", trace_snapshot},
127*58e6ee5fSAndroid Build Coastguard Worker 	{"hist", trace_hist},
128*58e6ee5fSAndroid Build Coastguard Worker 	{"mem", trace_mem},
129*58e6ee5fSAndroid Build Coastguard Worker 	{"listen", trace_listen},
130*58e6ee5fSAndroid Build Coastguard Worker 	{"agent", trace_agent},
131*58e6ee5fSAndroid Build Coastguard Worker 	{"setup-guest", trace_setup_guest},
132*58e6ee5fSAndroid Build Coastguard Worker 	{"split", trace_split},
133*58e6ee5fSAndroid Build Coastguard Worker 	{"restore", trace_restore},
134*58e6ee5fSAndroid Build Coastguard Worker 	{"stack", trace_stack},
135*58e6ee5fSAndroid Build Coastguard Worker 	{"check-events", trace_check_events},
136*58e6ee5fSAndroid Build Coastguard Worker 	{"record", trace_record},
137*58e6ee5fSAndroid Build Coastguard Worker 	{"start", trace_start},
138*58e6ee5fSAndroid Build Coastguard Worker 	{"set", trace_set},
139*58e6ee5fSAndroid Build Coastguard Worker 	{"extract", trace_extract},
140*58e6ee5fSAndroid Build Coastguard Worker 	{"stop", trace_stop},
141*58e6ee5fSAndroid Build Coastguard Worker 	{"stream", trace_stream},
142*58e6ee5fSAndroid Build Coastguard Worker 	{"profile", trace_profile},
143*58e6ee5fSAndroid Build Coastguard Worker 	{"restart", trace_restart},
144*58e6ee5fSAndroid Build Coastguard Worker 	{"clear", trace_clear},
145*58e6ee5fSAndroid Build Coastguard Worker 	{"reset", trace_reset},
146*58e6ee5fSAndroid Build Coastguard Worker 	{"stat", trace_stat},
147*58e6ee5fSAndroid Build Coastguard Worker 	{"options", trace_option},
148*58e6ee5fSAndroid Build Coastguard Worker 	{"show", trace_show},
149*58e6ee5fSAndroid Build Coastguard Worker 	{"list", trace_list},
150*58e6ee5fSAndroid Build Coastguard Worker 	{"help", trace_usage},
151*58e6ee5fSAndroid Build Coastguard Worker 	{"dump", trace_dump},
152*58e6ee5fSAndroid Build Coastguard Worker 	{"convert", trace_convert},
153*58e6ee5fSAndroid Build Coastguard Worker 	{"-h", trace_usage},
154*58e6ee5fSAndroid Build Coastguard Worker };
155*58e6ee5fSAndroid Build Coastguard Worker 
main(int argc,char ** argv)156*58e6ee5fSAndroid Build Coastguard Worker int main (int argc, char **argv)
157*58e6ee5fSAndroid Build Coastguard Worker {
158*58e6ee5fSAndroid Build Coastguard Worker 	int i;
159*58e6ee5fSAndroid Build Coastguard Worker 
160*58e6ee5fSAndroid Build Coastguard Worker 	errno = 0;
161*58e6ee5fSAndroid Build Coastguard Worker 
162*58e6ee5fSAndroid Build Coastguard Worker 	if (argc < 2)
163*58e6ee5fSAndroid Build Coastguard Worker 		trace_usage(argc, argv);
164*58e6ee5fSAndroid Build Coastguard Worker 
165*58e6ee5fSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(commands); ++i) {
166*58e6ee5fSAndroid Build Coastguard Worker 		if (strcmp(argv[1], commands[i].name) == 0 ){
167*58e6ee5fSAndroid Build Coastguard Worker 			commands[i].run(argc, argv);
168*58e6ee5fSAndroid Build Coastguard Worker 			goto out;
169*58e6ee5fSAndroid Build Coastguard Worker 		}
170*58e6ee5fSAndroid Build Coastguard Worker 	}
171*58e6ee5fSAndroid Build Coastguard Worker 
172*58e6ee5fSAndroid Build Coastguard Worker 	/* No valid command found, show help */
173*58e6ee5fSAndroid Build Coastguard Worker 	trace_usage(argc, argv);
174*58e6ee5fSAndroid Build Coastguard Worker out:
175*58e6ee5fSAndroid Build Coastguard Worker 	exit(0);
176*58e6ee5fSAndroid Build Coastguard Worker }
177