aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <rostedt@goodmis.org>2016-02-09 22:55:04 -0500
committerSteven Rostedt <rostedt@goodmis.org>2016-02-10 13:39:26 -0500
commitdbc44d738aca8ba0d72749ce26468028e1635c3b (patch)
treef58912bf74300a38ca15cbafa85f42366197d3bc
parent5ebd7cd9f25f29b0c5f2f6c3a05e6fcac184992e (diff)
downloadtrace-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.c64
-rw-r--r--trace-dialog.c48
-rw-r--r--trace-gui.h7
-rw-r--r--trace-view-main.c43
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)