diff options
author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2015-05-26 16:51:51 -0400 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2015-06-10 15:12:08 -0400 |
commit | 8cdbccd5ef422dc518e7246aa1c41922e834120b (patch) | |
tree | 15a70b515ac4453da8f112dcb43ec42462898ee6 | |
parent | 996bbe5a450ae1a096e8a576c9a168ef6884a514 (diff) | |
download | trace-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.c | 27 | ||||
-rw-r--r-- | kbuffer.h | 2 | ||||
-rw-r--r-- | trace-cmd.h | 4 | ||||
-rw-r--r-- | trace-input.c | 27 | ||||
-rw-r--r-- | trace-read.c | 22 |
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) @@ -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; |