aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2015-05-26 16:51:51 -0400
committerSteven Rostedt <rostedt@goodmis.org>2015-06-10 15:12:08 -0400
commit8cdbccd5ef422dc518e7246aa1c41922e834120b (patch)
tree15a70b515ac4453da8f112dcb43ec42462898ee6
parent996bbe5a450ae1a096e8a576c9a168ef6884a514 (diff)
downloadtrace-cmd-8cdbccd5ef422dc518e7246aa1c41922e834120b.tar.gz
trace-cmd: Add --debug to trace-cmd report
Add --debug option to trace-cmd report that enables page boundary recording as well as time stamp info to be printed. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--kbuffer-parse.c27
-rw-r--r--kbuffer.h2
-rw-r--r--trace-cmd.h4
-rw-r--r--trace-input.c27
-rw-r--r--trace-read.c22
5 files changed, 79 insertions, 3 deletions
diff --git a/kbuffer-parse.c b/kbuffer-parse.c
index 3bcada3a..fca326ca 100644
--- a/kbuffer-parse.c
+++ b/kbuffer-parse.c
@@ -561,6 +561,33 @@ int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer)
}
/**
+ * kbuffer_subbuf_timestamp - read the timestamp from a sub buffer
+ * @kbuf: The kbuffer to load
+ * @subbuf: The subbuffer to read from.
+ *
+ * Return the timestamp from a subbuffer.
+ */
+unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf)
+{
+ return kbuf->read_8(subbuf);
+}
+
+/**
+ * kbuffer_ptr_delta - read the delta field from a record
+ * @kbuf: The kbuffer to load
+ * @ptr: The record in the buffe.
+ *
+ * Return the timestamp delta from a record
+ */
+unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr)
+{
+ unsigned int type_len_ts;
+
+ type_len_ts = read_4(kbuf, ptr);
+ return ts4host(kbuf, type_len_ts);
+}
+
+/**
* kbuffer_read_event - read the next event in the kbuffer subbuffer
* @kbuf: The kbuffer to read from
* @ts: The address to store the timestamp of the event (may be NULL to ignore)
diff --git a/kbuffer.h b/kbuffer.h
index 03dce757..45dbeca6 100644
--- a/kbuffer.h
+++ b/kbuffer.h
@@ -49,6 +49,8 @@ int kbuffer_load_subbuffer(struct kbuffer *kbuf, void *subbuffer);
void *kbuffer_read_event(struct kbuffer *kbuf, unsigned long long *ts);
void *kbuffer_next_event(struct kbuffer *kbuf, unsigned long long *ts);
unsigned long long kbuffer_timestamp(struct kbuffer *kbuf);
+unsigned long long kbuffer_subbuf_timestamp(struct kbuffer *kbuf, void *subbuf);
+unsigned int kbuffer_ptr_delta(struct kbuffer *kbuf, void *ptr);
void *kbuffer_translate_data(int swap, void *data, unsigned int *size);
diff --git a/trace-cmd.h b/trace-cmd.h
index 59194ef4..a6983448 100644
--- a/trace-cmd.h
+++ b/trace-cmd.h
@@ -191,6 +191,10 @@ char *tracecmd_get_tracing_file(const char *name);
void tracecmd_put_tracing_file(char *name);
int tracecmd_record_at_buffer_start(struct tracecmd_input *handle, struct pevent_record *record);
+unsigned long long tracecmd_page_ts(struct tracecmd_input *handle,
+ struct pevent_record *record);
+unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle,
+ struct pevent_record *record);
#ifndef SWIG
/* hack for function graph work around */
diff --git a/trace-input.c b/trace-input.c
index 53b7afa1..a7e0ff2a 100644
--- a/trace-input.c
+++ b/trace-input.c
@@ -2820,6 +2820,33 @@ int tracecmd_record_at_buffer_start(struct tracecmd_input *handle,
return offset == kbuffer_start_of_data(kbuf);
}
+unsigned long long tracecmd_page_ts(struct tracecmd_input *handle,
+ struct pevent_record *record)
+{
+ struct page *page = record->priv;
+ struct kbuffer *kbuf = handle->cpu_data[record->cpu].kbuf;
+
+ if (!page || !kbuf)
+ return 0;
+
+ return kbuffer_subbuf_timestamp(kbuf, page->map);
+}
+
+unsigned int tracecmd_record_ts_delta(struct tracecmd_input *handle,
+ struct pevent_record *record)
+{
+ struct kbuffer *kbuf = handle->cpu_data[record->cpu].kbuf;
+ struct page *page = record->priv;
+ int offset;
+
+ if (!page || !kbuf)
+ return 0;
+
+ offset = record->offset - page->offset;
+
+ return kbuffer_ptr_delta(kbuf, page->map + offset);
+}
+
int tracecmd_buffer_instances(struct tracecmd_input *handle)
{
return handle->nr_buffers;
diff --git a/trace-read.c b/trace-read.c
index 17636a7c..e496ef0f 100644
--- a/trace-read.c
+++ b/trace-read.c
@@ -103,6 +103,7 @@ static int stacktrace_id;
static int profile;
static int buffer_breaks = 0;
+static int debug = 0;
static struct format_field *wakeup_task;
static struct format_field *wakeup_success;
@@ -760,13 +761,22 @@ void trace_show_data(struct tracecmd_input *handle, struct pevent_record *record
cpu, record->missed_events);
else if (record->missed_events < 0)
trace_seq_printf(&s, "CPU:%d [EVENTS DROPPED]\n", cpu);
- if (buffer_breaks && tracecmd_record_at_buffer_start(handle, record))
- trace_seq_printf(&s, "CPU:%d [SUBBUFFER START]\n", cpu);
-
+ if (buffer_breaks || debug) {
+ if (tracecmd_record_at_buffer_start(handle, record)) {
+ trace_seq_printf(&s, "CPU:%d [SUBBUFFER START]", cpu);
+ if (debug)
+ trace_seq_printf(&s, " [%lld]",
+ tracecmd_page_ts(handle, record));
+ trace_seq_putc(&s, '\n');
+ }
+ }
use_trace_clock = tracecmd_get_use_trace_clock(handle);
pevent_print_event(pevent, &s, record, use_trace_clock);
if (s.len && *(s.buffer + s.len - 1) == '\n')
s.len--;
+ if (debug)
+ trace_seq_printf(&s, " [%d]",
+ tracecmd_record_ts_delta(handle, record));
trace_seq_do_printf(&s);
trace_seq_destroy(&s);
@@ -1274,6 +1284,7 @@ static void add_hook(const char *arg)
}
enum {
+ OPT_debug = 243,
OPT_uname = 244,
OPT_profile = 245,
OPT_event = 246,
@@ -1346,6 +1357,7 @@ void trace_report (int argc, char **argv)
{"nodate", no_argument, NULL, OPT_nodate},
{"stat", no_argument, NULL, OPT_stat},
{"boundary", no_argument, NULL, OPT_boundary},
+ {"debug", no_argument, NULL, OPT_debug},
{"profile", no_argument, NULL, OPT_profile},
{"uname", no_argument, NULL, OPT_uname},
{"help", no_argument, NULL, '?'},
@@ -1471,6 +1483,10 @@ void trace_report (int argc, char **argv)
/* Debug to look at buffer breaks */
buffer_breaks = 1;
break;
+ case OPT_debug:
+ buffer_breaks = 1;
+ debug = 1;
+ break;
case OPT_profile:
profile = 1;
break;