diff options
author | Steven Rostedt <rostedt@goodmis.org> | 2016-02-09 22:55:04 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2016-02-10 13:39:26 -0500 |
commit | dbc44d738aca8ba0d72749ce26468028e1635c3b (patch) | |
tree | f58912bf74300a38ca15cbafa85f42366197d3bc | |
parent | 5ebd7cd9f25f29b0c5f2f6c3a05e6fcac184992e (diff) | |
download | trace-cmd-dbc44d738aca8ba0d72749ce26468028e1635c3b.tar.gz |
kernelshark: Show event data
Add a display to show an events data in a popup window for the event list.
Add both a normal event output and a raw event.
The normal event is useful when an event has more than one line,
like stack traces, as the rows still don't work quite right.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | kernel-shark.c | 64 | ||||
-rw-r--r-- | trace-dialog.c | 48 | ||||
-rw-r--r-- | trace-gui.h | 7 | ||||
-rw-r--r-- | trace-view-main.c | 43 |
4 files changed, 162 insertions, 0 deletions
diff --git a/kernel-shark.c b/kernel-shark.c index 3100bf34..58ab9d63 100644 --- a/kernel-shark.c +++ b/kernel-shark.c @@ -1445,6 +1445,49 @@ filter_hide_task_clicked (gpointer data) } static void +handle_display_event_clicked (gpointer data, gboolean raw) +{ + struct shark_info *info = data; + struct pevent_record *record; + struct pevent *pevent; + TraceViewRecord *vrec; + GtkTreeModel *model; + guint64 offset; + gint row; + gint cpu; + + row = trace_view_get_selected_row(GTK_WIDGET(info->treeview)); + if (row < 0) + return; + + model = gtk_tree_view_get_model(GTK_TREE_VIEW(info->treeview)); + vrec = trace_view_store_get_row(TRACE_VIEW_STORE(model), row); + offset = vrec->offset; + + record = tracecmd_read_at(info->handle, offset, &cpu); + if (!record) + return; + + pevent = tracecmd_get_pevent(info->handle); + trace_show_record_dialog(GTK_WINDOW(info->window), + pevent, record, raw); + + free_record(record); +} + +static void +display_event_clicked (gpointer data) +{ + handle_display_event_clicked(data, FALSE); +} + +static void +display_raw_event_clicked (gpointer data) +{ + handle_display_event_clicked(data, TRUE); +} + +static void filter_graph_hide_task_clicked (gpointer data) { struct shark_info *info = data; @@ -1510,6 +1553,8 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) static GtkWidget *menu_filter_graph_add_task; static GtkWidget *menu_filter_graph_hide_task; static GtkWidget *menu_filter_graph_clear_tasks; + static GtkWidget *menu_display_event; + static GtkWidget *menu_display_raw_event; struct pevent_record *record; TraceViewRecord *vrec; GtkTreeModel *model; @@ -1586,6 +1631,21 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) G_CALLBACK (filter_graph_clear_tasks_clicked), data); + menu_display_event = gtk_menu_item_new_with_label("Display event"); + gtk_widget_show(menu_display_event); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_display_event); + + g_signal_connect_swapped (G_OBJECT (menu_display_event), "activate", + G_CALLBACK (display_event_clicked), + data); + + menu_display_raw_event = gtk_menu_item_new_with_label("Display raw event"); + gtk_widget_show(menu_display_raw_event); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_display_raw_event); + + g_signal_connect_swapped (G_OBJECT (menu_display_raw_event), "activate", + G_CALLBACK (display_raw_event_clicked), + data); } row = trace_view_get_selected_row(GTK_WIDGET(info->treeview)); @@ -1658,6 +1718,8 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) gtk_widget_show(menu_filter_add_task); gtk_widget_show(menu_filter_hide_task); + gtk_widget_show(menu_display_event); + gtk_widget_show(menu_display_raw_event); free_record(record); } } else { @@ -1665,6 +1727,8 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) gtk_widget_hide(menu_filter_hide_task); gtk_widget_hide(menu_filter_graph_add_task); gtk_widget_hide(menu_filter_graph_hide_task); + gtk_widget_hide(menu_display_event); + gtk_widget_hide(menu_display_raw_event); } if (ginfo->filter_enabled) diff --git a/trace-dialog.c b/trace-dialog.c index 0b71138b..5447e767 100644 --- a/trace-dialog.c +++ b/trace-dialog.c @@ -349,6 +349,9 @@ GtkResponseType trace_dialog(GtkWindow *parent, enum trace_dialog_type type, parent = GTK_WINDOW(parent_window); switch (type) { + case TRACE_GUI_OTHER: + mtype = GTK_MESSAGE_OTHER; + break; case TRACE_GUI_INFO: mtype = GTK_MESSAGE_INFO; break; @@ -382,6 +385,51 @@ GtkResponseType trace_dialog(GtkWindow *parent, enum trace_dialog_type type, return result; } +static void read_raw_events(struct trace_seq *s, + struct event_format *event, + struct pevent_record *record) +{ + struct format_field **fields; + int i; + + fields = pevent_event_fields(event); + if (!fields) + return; + + for (i = 0; fields[i]; i++) { + trace_seq_printf(s, "%s: ", fields[i]->name); + pevent_print_field(s, record->data, fields[i]); + trace_seq_putc(s, '\n'); + } + + free(fields); +} + +void trace_show_record_dialog(GtkWindow *parent, struct pevent *pevent, + struct pevent_record *record, gboolean raw) +{ + struct event_format *event; + struct trace_seq s; + int type; + + trace_seq_init(&s); + + type = pevent_data_type(pevent, record); + event = pevent_data_event_from_type(pevent, type); + + if (raw) + read_raw_events(&s, event, record); + else + pevent_print_event(pevent, &s, record, FALSE); + + if (s.buffer_size) { + trace_seq_terminate(&s); + trace_dialog(parent, TRACE_GUI_OTHER, s.buffer); + } + + trace_seq_destroy(&s); +} + /** * trace_get_file_dialog - pop up a file dialog to get a file * @title: the title of the dialog diff --git a/trace-gui.h b/trace-gui.h index bcdcd7bf..b05548ab 100644 --- a/trace-gui.h +++ b/trace-gui.h @@ -23,6 +23,7 @@ #include <gtk/gtk.h> enum trace_dialog_type { + TRACE_GUI_OTHER, TRACE_GUI_INFO, TRACE_GUI_WARNING, TRACE_GUI_ERROR, @@ -61,4 +62,10 @@ trace_create_combo_box(GtkWidget *hbox, const gchar *text, GtkTreeModel *(*combo_model_create)(gpointer data), gpointer data); +struct pevent; +struct pevent_record; + +void trace_show_record_dialog(GtkWindow *parent, struct pevent *pevent, + struct pevent_record *record, gboolean raw); + #endif /* _TRACE_GUI */ diff --git a/trace-view-main.c b/trace-view-main.c index 935b8c14..71eff723 100644 --- a/trace-view-main.c +++ b/trace-view-main.c @@ -283,6 +283,26 @@ filter_clear_tasks_clicked (gpointer data) info->filter_enabled = 0; } +static void +display_event_clicked (gpointer data) +{ + struct trace_tree_info *info = data; + + return; + trace_view_update_filters(info->trace_tree, NULL, NULL); + info->filter_enabled = 0; +} + +static void +display_raw_event_clicked (gpointer data) +{ + struct trace_tree_info *info = data; + + return; + trace_view_update_filters(info->trace_tree, NULL, NULL); + info->filter_enabled = 0; +} + static gboolean do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) { @@ -292,6 +312,8 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) static GtkWidget *menu_filter_add_task; static GtkWidget *menu_filter_hide_task; static GtkWidget *menu_filter_clear_tasks; + static GtkWidget *menu_display_event; + static GtkWidget *menu_display_raw_event; struct pevent *pevent; struct pevent_record *record; TraceViewRecord *vrec; @@ -339,6 +361,22 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) G_CALLBACK (filter_clear_tasks_clicked), data); + + menu_display_event = gtk_menu_item_new_with_label("Display event"); + gtk_widget_show(menu_display_event); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_display_event); + + g_signal_connect_swapped (G_OBJECT (menu_display_event), "activate", + G_CALLBACK (display_event_clicked), + data); + + menu_display_raw_event = gtk_menu_item_new_with_label("Display raw event"); + gtk_widget_show(menu_display_raw_event); + gtk_menu_shell_append(GTK_MENU_SHELL (menu), menu_display_raw_event); + + g_signal_connect_swapped (G_OBJECT (menu_display_raw_event), "activate", + G_CALLBACK (display_raw_event_clicked), + data); } row = trace_view_get_selected_row(GTK_WIDGET(info->trace_tree)); @@ -384,11 +422,16 @@ do_tree_popup(GtkWidget *widget, GdkEventButton *event, gpointer data) gtk_widget_show(menu_filter_add_task); gtk_widget_show(menu_filter_hide_task); + + gtk_widget_show(menu_display_event); + gtk_widget_show(menu_display_raw_event); free_record(record); } } else { gtk_widget_hide(menu_filter_add_task); gtk_widget_hide(menu_filter_hide_task); + gtk_widget_hide(menu_display_event); + gtk_widget_hide(menu_display_raw_event); } if (info->filter_enabled) |