xref: /aosp_15_r20/external/trace-cmd/tracecmd/trace-show.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) 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 <stdlib.h>
7*58e6ee5fSAndroid Build Coastguard Worker #include <getopt.h>
8*58e6ee5fSAndroid Build Coastguard Worker #include <errno.h>
9*58e6ee5fSAndroid Build Coastguard Worker 
10*58e6ee5fSAndroid Build Coastguard Worker #include "tracefs.h"
11*58e6ee5fSAndroid Build Coastguard Worker #include "trace-local.h"
12*58e6ee5fSAndroid Build Coastguard Worker 
13*58e6ee5fSAndroid Build Coastguard Worker enum {
14*58e6ee5fSAndroid Build Coastguard Worker 	OPT_tracing_on			= 255,
15*58e6ee5fSAndroid Build Coastguard Worker 	OPT_current_tracer		= 254,
16*58e6ee5fSAndroid Build Coastguard Worker 	OPT_buffer_size_kb		= 253,
17*58e6ee5fSAndroid Build Coastguard Worker 	OPT_buffer_total_size_kb	= 252,
18*58e6ee5fSAndroid Build Coastguard Worker 	OPT_ftrace_filter		= 251,
19*58e6ee5fSAndroid Build Coastguard Worker 	OPT_ftrace_notrace		= 250,
20*58e6ee5fSAndroid Build Coastguard Worker 	OPT_ftrace_pid			= 249,
21*58e6ee5fSAndroid Build Coastguard Worker 	OPT_graph_function		= 248,
22*58e6ee5fSAndroid Build Coastguard Worker 	OPT_graph_notrace		= 247,
23*58e6ee5fSAndroid Build Coastguard Worker 	OPT_cpumask			= 246,
24*58e6ee5fSAndroid Build Coastguard Worker };
25*58e6ee5fSAndroid Build Coastguard Worker 
trace_show(int argc,char ** argv)26*58e6ee5fSAndroid Build Coastguard Worker void trace_show(int argc, char **argv)
27*58e6ee5fSAndroid Build Coastguard Worker {
28*58e6ee5fSAndroid Build Coastguard Worker 	const char *buffer = NULL;
29*58e6ee5fSAndroid Build Coastguard Worker 	const char *file = "trace";
30*58e6ee5fSAndroid Build Coastguard Worker 	const char *cpu = NULL;
31*58e6ee5fSAndroid Build Coastguard Worker 	struct buffer_instance *instance = &top_instance;
32*58e6ee5fSAndroid Build Coastguard Worker 	char cpu_path[128];
33*58e6ee5fSAndroid Build Coastguard Worker 	char *path;
34*58e6ee5fSAndroid Build Coastguard Worker 	int snap = 0;
35*58e6ee5fSAndroid Build Coastguard Worker 	int pipe = 0;
36*58e6ee5fSAndroid Build Coastguard Worker 	int show_name = 0;
37*58e6ee5fSAndroid Build Coastguard Worker 	int option_index = 0;
38*58e6ee5fSAndroid Build Coastguard Worker 	int stop = 0;
39*58e6ee5fSAndroid Build Coastguard Worker 	int c;
40*58e6ee5fSAndroid Build Coastguard Worker 	static struct option long_options[] = {
41*58e6ee5fSAndroid Build Coastguard Worker 		{"tracing_on", no_argument, NULL, OPT_tracing_on},
42*58e6ee5fSAndroid Build Coastguard Worker 		{"current_tracer", no_argument, NULL, OPT_current_tracer},
43*58e6ee5fSAndroid Build Coastguard Worker 		{"buffer_size", no_argument, NULL, OPT_buffer_size_kb},
44*58e6ee5fSAndroid Build Coastguard Worker 		{"buffer_total_size", no_argument, NULL, OPT_buffer_total_size_kb},
45*58e6ee5fSAndroid Build Coastguard Worker 		{"ftrace_filter", no_argument, NULL, OPT_ftrace_filter},
46*58e6ee5fSAndroid Build Coastguard Worker 		{"ftrace_notrace", no_argument, NULL, OPT_ftrace_notrace},
47*58e6ee5fSAndroid Build Coastguard Worker 		{"ftrace_pid", no_argument, NULL, OPT_ftrace_pid},
48*58e6ee5fSAndroid Build Coastguard Worker 		{"graph_function", no_argument, NULL, OPT_graph_function},
49*58e6ee5fSAndroid Build Coastguard Worker 		{"graph_notrace", no_argument, NULL, OPT_graph_notrace},
50*58e6ee5fSAndroid Build Coastguard Worker 		{"cpumask", no_argument, NULL, OPT_cpumask},
51*58e6ee5fSAndroid Build Coastguard Worker 		{"help", no_argument, NULL, '?'},
52*58e6ee5fSAndroid Build Coastguard Worker 		{NULL, 0, NULL, 0}
53*58e6ee5fSAndroid Build Coastguard Worker 	};
54*58e6ee5fSAndroid Build Coastguard Worker 
55*58e6ee5fSAndroid Build Coastguard Worker 	init_top_instance();
56*58e6ee5fSAndroid Build Coastguard Worker 
57*58e6ee5fSAndroid Build Coastguard Worker 	while ((c = getopt_long(argc-1, argv+1, "B:c:fsp",
58*58e6ee5fSAndroid Build Coastguard Worker 				long_options, &option_index)) >= 0) {
59*58e6ee5fSAndroid Build Coastguard Worker 		switch (c) {
60*58e6ee5fSAndroid Build Coastguard Worker 		case 'h':
61*58e6ee5fSAndroid Build Coastguard Worker 			usage(argv);
62*58e6ee5fSAndroid Build Coastguard Worker 			break;
63*58e6ee5fSAndroid Build Coastguard Worker 		case 'B':
64*58e6ee5fSAndroid Build Coastguard Worker 			if (buffer)
65*58e6ee5fSAndroid Build Coastguard Worker 				die("Can only show one buffer at a time");
66*58e6ee5fSAndroid Build Coastguard Worker 			buffer = optarg;
67*58e6ee5fSAndroid Build Coastguard Worker 			instance = allocate_instance(optarg);
68*58e6ee5fSAndroid Build Coastguard Worker 			if (!instance)
69*58e6ee5fSAndroid Build Coastguard Worker 				die("Failed to create instance");
70*58e6ee5fSAndroid Build Coastguard Worker 			break;
71*58e6ee5fSAndroid Build Coastguard Worker 		case 'c':
72*58e6ee5fSAndroid Build Coastguard Worker 			if (cpu)
73*58e6ee5fSAndroid Build Coastguard Worker 				die("Can only show one CPU at a time");
74*58e6ee5fSAndroid Build Coastguard Worker 			cpu = optarg;
75*58e6ee5fSAndroid Build Coastguard Worker 			break;
76*58e6ee5fSAndroid Build Coastguard Worker 		case 'f':
77*58e6ee5fSAndroid Build Coastguard Worker 			show_name = 1;
78*58e6ee5fSAndroid Build Coastguard Worker 			break;
79*58e6ee5fSAndroid Build Coastguard Worker 		case 's':
80*58e6ee5fSAndroid Build Coastguard Worker 			snap = 1;
81*58e6ee5fSAndroid Build Coastguard Worker 			if (pipe)
82*58e6ee5fSAndroid Build Coastguard Worker 				die("Can not have -s and -p together");
83*58e6ee5fSAndroid Build Coastguard Worker 			break;
84*58e6ee5fSAndroid Build Coastguard Worker 		case 'p':
85*58e6ee5fSAndroid Build Coastguard Worker 			pipe = 1;
86*58e6ee5fSAndroid Build Coastguard Worker 			if (snap)
87*58e6ee5fSAndroid Build Coastguard Worker 				die("Can not have -s and -p together");
88*58e6ee5fSAndroid Build Coastguard Worker 			break;
89*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_tracing_on:
90*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "tracing_on");
91*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
92*58e6ee5fSAndroid Build Coastguard Worker 			break;
93*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_current_tracer:
94*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "current_tracer");
95*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
96*58e6ee5fSAndroid Build Coastguard Worker 			break;
97*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_buffer_size_kb:
98*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "buffer_size_kb");
99*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
100*58e6ee5fSAndroid Build Coastguard Worker 			break;
101*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_buffer_total_size_kb:
102*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "buffer_total_size_kb");
103*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
104*58e6ee5fSAndroid Build Coastguard Worker 			break;
105*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_ftrace_filter:
106*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "set_ftrace_filter");
107*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
108*58e6ee5fSAndroid Build Coastguard Worker 			break;
109*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_ftrace_notrace:
110*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "set_ftrace_notrace");
111*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
112*58e6ee5fSAndroid Build Coastguard Worker 			break;
113*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_ftrace_pid:
114*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "set_ftrace_pid");
115*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
116*58e6ee5fSAndroid Build Coastguard Worker 			break;
117*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_graph_function:
118*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "set_graph_function");
119*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
120*58e6ee5fSAndroid Build Coastguard Worker 			break;
121*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_graph_notrace:
122*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "set_graph_notrace");
123*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
124*58e6ee5fSAndroid Build Coastguard Worker 			break;
125*58e6ee5fSAndroid Build Coastguard Worker 		case OPT_cpumask:
126*58e6ee5fSAndroid Build Coastguard Worker 			show_instance_file(instance, "tracing_cpumask");
127*58e6ee5fSAndroid Build Coastguard Worker 			stop = 1;
128*58e6ee5fSAndroid Build Coastguard Worker 			break;
129*58e6ee5fSAndroid Build Coastguard Worker 		default:
130*58e6ee5fSAndroid Build Coastguard Worker 			usage(argv);
131*58e6ee5fSAndroid Build Coastguard Worker 		}
132*58e6ee5fSAndroid Build Coastguard Worker 	}
133*58e6ee5fSAndroid Build Coastguard Worker 	if (stop)
134*58e6ee5fSAndroid Build Coastguard Worker 		exit(0);
135*58e6ee5fSAndroid Build Coastguard Worker 	if (pipe)
136*58e6ee5fSAndroid Build Coastguard Worker 		file = "trace_pipe";
137*58e6ee5fSAndroid Build Coastguard Worker 	else if (snap)
138*58e6ee5fSAndroid Build Coastguard Worker 		file = "snapshot";
139*58e6ee5fSAndroid Build Coastguard Worker 
140*58e6ee5fSAndroid Build Coastguard Worker 	if (cpu) {
141*58e6ee5fSAndroid Build Coastguard Worker 		char *endptr;
142*58e6ee5fSAndroid Build Coastguard Worker 		long val;
143*58e6ee5fSAndroid Build Coastguard Worker 
144*58e6ee5fSAndroid Build Coastguard Worker 		errno = 0;
145*58e6ee5fSAndroid Build Coastguard Worker 		val = strtol(cpu, &endptr, 0);
146*58e6ee5fSAndroid Build Coastguard Worker 		if (errno || cpu == endptr)
147*58e6ee5fSAndroid Build Coastguard Worker 			die("Invalid CPU index '%s'", cpu);
148*58e6ee5fSAndroid Build Coastguard Worker 		snprintf(cpu_path, 128, "per_cpu/cpu%ld/%s", val, file);
149*58e6ee5fSAndroid Build Coastguard Worker 		file = cpu_path;
150*58e6ee5fSAndroid Build Coastguard Worker 	}
151*58e6ee5fSAndroid Build Coastguard Worker 
152*58e6ee5fSAndroid Build Coastguard Worker 	if (buffer) {
153*58e6ee5fSAndroid Build Coastguard Worker 		int ret;
154*58e6ee5fSAndroid Build Coastguard Worker 
155*58e6ee5fSAndroid Build Coastguard Worker 		ret = asprintf(&path, "instances/%s/%s", buffer, file);
156*58e6ee5fSAndroid Build Coastguard Worker 		if (ret < 0)
157*58e6ee5fSAndroid Build Coastguard Worker 			die("Failed to allocate instance path %s", file);
158*58e6ee5fSAndroid Build Coastguard Worker 		file = path;
159*58e6ee5fSAndroid Build Coastguard Worker 	}
160*58e6ee5fSAndroid Build Coastguard Worker 
161*58e6ee5fSAndroid Build Coastguard Worker 	if (show_name) {
162*58e6ee5fSAndroid Build Coastguard Worker 		char *name;
163*58e6ee5fSAndroid Build Coastguard Worker 		name = tracefs_get_tracing_file(file);
164*58e6ee5fSAndroid Build Coastguard Worker 		printf("%s\n", name);
165*58e6ee5fSAndroid Build Coastguard Worker 		tracefs_put_tracing_file(name);
166*58e6ee5fSAndroid Build Coastguard Worker 	}
167*58e6ee5fSAndroid Build Coastguard Worker 	show_file(file);
168*58e6ee5fSAndroid Build Coastguard Worker 	if (buffer)
169*58e6ee5fSAndroid Build Coastguard Worker 		free(path);
170*58e6ee5fSAndroid Build Coastguard Worker 
171*58e6ee5fSAndroid Build Coastguard Worker 	return;
172*58e6ee5fSAndroid Build Coastguard Worker }
173