aboutsummaryrefslogtreecommitdiff
path: root/tracecmd/trace-show.c
diff options
context:
space:
mode:
Diffstat (limited to 'tracecmd/trace-show.c')
-rw-r--r--tracecmd/trace-show.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/tracecmd/trace-show.c b/tracecmd/trace-show.c
new file mode 100644
index 00000000..eb328527
--- /dev/null
+++ b/tracecmd/trace-show.c
@@ -0,0 +1,172 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2009, 2010 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
+ *
+ */
+#include <stdlib.h>
+#include <getopt.h>
+#include <errno.h>
+
+#include "tracefs.h"
+#include "trace-local.h"
+
+enum {
+ OPT_tracing_on = 255,
+ OPT_current_tracer = 254,
+ OPT_buffer_size_kb = 253,
+ OPT_buffer_total_size_kb = 252,
+ OPT_ftrace_filter = 251,
+ OPT_ftrace_notrace = 250,
+ OPT_ftrace_pid = 249,
+ OPT_graph_function = 248,
+ OPT_graph_notrace = 247,
+ OPT_cpumask = 246,
+};
+
+void trace_show(int argc, char **argv)
+{
+ const char *buffer = NULL;
+ const char *file = "trace";
+ const char *cpu = NULL;
+ struct buffer_instance *instance = &top_instance;
+ char cpu_path[128];
+ char *path;
+ int snap = 0;
+ int pipe = 0;
+ int show_name = 0;
+ int option_index = 0;
+ int stop = 0;
+ int c;
+ static struct option long_options[] = {
+ {"tracing_on", no_argument, NULL, OPT_tracing_on},
+ {"current_tracer", no_argument, NULL, OPT_current_tracer},
+ {"buffer_size", no_argument, NULL, OPT_buffer_size_kb},
+ {"buffer_total_size", no_argument, NULL, OPT_buffer_total_size_kb},
+ {"ftrace_filter", no_argument, NULL, OPT_ftrace_filter},
+ {"ftrace_notrace", no_argument, NULL, OPT_ftrace_notrace},
+ {"ftrace_pid", no_argument, NULL, OPT_ftrace_pid},
+ {"graph_function", no_argument, NULL, OPT_graph_function},
+ {"graph_notrace", no_argument, NULL, OPT_graph_notrace},
+ {"cpumask", no_argument, NULL, OPT_cpumask},
+ {"help", no_argument, NULL, '?'},
+ {NULL, 0, NULL, 0}
+ };
+
+ init_top_instance();
+
+ while ((c = getopt_long(argc-1, argv+1, "B:c:fsp",
+ long_options, &option_index)) >= 0) {
+ switch (c) {
+ case 'h':
+ usage(argv);
+ break;
+ case 'B':
+ if (buffer)
+ die("Can only show one buffer at a time");
+ buffer = optarg;
+ instance = allocate_instance(optarg);
+ if (!instance)
+ die("Failed to create instance");
+ break;
+ case 'c':
+ if (cpu)
+ die("Can only show one CPU at a time");
+ cpu = optarg;
+ break;
+ case 'f':
+ show_name = 1;
+ break;
+ case 's':
+ snap = 1;
+ if (pipe)
+ die("Can not have -s and -p together");
+ break;
+ case 'p':
+ pipe = 1;
+ if (snap)
+ die("Can not have -s and -p together");
+ break;
+ case OPT_tracing_on:
+ show_instance_file(instance, "tracing_on");
+ stop = 1;
+ break;
+ case OPT_current_tracer:
+ show_instance_file(instance, "current_tracer");
+ stop = 1;
+ break;
+ case OPT_buffer_size_kb:
+ show_instance_file(instance, "buffer_size_kb");
+ stop = 1;
+ break;
+ case OPT_buffer_total_size_kb:
+ show_instance_file(instance, "buffer_total_size_kb");
+ stop = 1;
+ break;
+ case OPT_ftrace_filter:
+ show_instance_file(instance, "set_ftrace_filter");
+ stop = 1;
+ break;
+ case OPT_ftrace_notrace:
+ show_instance_file(instance, "set_ftrace_notrace");
+ stop = 1;
+ break;
+ case OPT_ftrace_pid:
+ show_instance_file(instance, "set_ftrace_pid");
+ stop = 1;
+ break;
+ case OPT_graph_function:
+ show_instance_file(instance, "set_graph_function");
+ stop = 1;
+ break;
+ case OPT_graph_notrace:
+ show_instance_file(instance, "set_graph_notrace");
+ stop = 1;
+ break;
+ case OPT_cpumask:
+ show_instance_file(instance, "tracing_cpumask");
+ stop = 1;
+ break;
+ default:
+ usage(argv);
+ }
+ }
+ if (stop)
+ exit(0);
+ if (pipe)
+ file = "trace_pipe";
+ else if (snap)
+ file = "snapshot";
+
+ if (cpu) {
+ char *endptr;
+ long val;
+
+ errno = 0;
+ val = strtol(cpu, &endptr, 0);
+ if (errno || cpu == endptr)
+ die("Invalid CPU index '%s'", cpu);
+ snprintf(cpu_path, 128, "per_cpu/cpu%ld/%s", val, file);
+ file = cpu_path;
+ }
+
+ if (buffer) {
+ int ret;
+
+ ret = asprintf(&path, "instances/%s/%s", buffer, file);
+ if (ret < 0)
+ die("Failed to allocate instance path %s", file);
+ file = path;
+ }
+
+ if (show_name) {
+ char *name;
+ name = tracefs_get_tracing_file(file);
+ printf("%s\n", name);
+ tracefs_put_tracing_file(name);
+ }
+ show_file(file);
+ if (buffer)
+ free(path);
+
+ return;
+}