perf hists browser: Add verbose mode hotkey
authorArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 3 Aug 2012 16:53:40 +0000 (13:53 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Mon, 6 Aug 2012 14:56:54 +0000 (11:56 -0300)
Right now just shows the DSO name in callchain entries, to help debug
the DWARF CFI post unwind code.

Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-54gouunatugtfw92j6gddk45@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/ui/browsers/hists.c

index 413bd62..b809469 100644 (file)
@@ -24,6 +24,7 @@ struct hist_browser {
        struct hist_entry   *he_selection;
        struct map_symbol   *selection;
        int                  print_seq;
+       bool                 show_dso;
        bool                 has_symbols;
 };
 
@@ -376,12 +377,19 @@ out:
 }
 
 static char *callchain_list__sym_name(struct callchain_list *cl,
-                                     char *bf, size_t bfsize)
+                                     char *bf, size_t bfsize, bool show_dso)
 {
+       int printed;
+
        if (cl->ms.sym)
-               return cl->ms.sym->name;
+               printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name);
+       else
+               printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip);
+
+       if (show_dso)
+               scnprintf(bf + printed, bfsize - printed, " %s",
+                         cl->ms.map ? cl->ms.map->dso->short_name : "unknown");
 
-       snprintf(bf, bfsize, "%#" PRIx64, cl->ip);
        return bf;
 }
 
@@ -417,7 +425,7 @@ static int hist_browser__show_callchain_node_rb_tree(struct hist_browser *browse
                remaining -= cumul;
 
                list_for_each_entry(chain, &child->val, list) {
-                       char ipstr[BITS_PER_LONG / 4 + 1], *alloc_str;
+                       char bf[1024], *alloc_str;
                        const char *str;
                        int color;
                        bool was_first = first;
@@ -434,7 +442,8 @@ static int hist_browser__show_callchain_node_rb_tree(struct hist_browser *browse
                        }
 
                        alloc_str = NULL;
-                       str = callchain_list__sym_name(chain, ipstr, sizeof(ipstr));
+                       str = callchain_list__sym_name(chain, bf, sizeof(bf),
+                                                      browser->show_dso);
                        if (was_first) {
                                double percent = cumul * 100.0 / new_total;
 
@@ -493,7 +502,7 @@ static int hist_browser__show_callchain_node(struct hist_browser *browser,
        char folded_sign = ' ';
 
        list_for_each_entry(chain, &node->val, list) {
-               char ipstr[BITS_PER_LONG / 4 + 1], *s;
+               char bf[1024], *s;
                int color;
 
                folded_sign = callchain_list__folded(chain);
@@ -510,7 +519,8 @@ static int hist_browser__show_callchain_node(struct hist_browser *browser,
                        *is_current_entry = true;
                }
 
-               s = callchain_list__sym_name(chain, ipstr, sizeof(ipstr));
+               s = callchain_list__sym_name(chain, bf, sizeof(bf),
+                                            browser->show_dso);
                ui_browser__gotorc(&browser->b, row, 0);
                ui_browser__set_color(&browser->b, color);
                slsmg_write_nstring(" ", offset);
@@ -830,7 +840,7 @@ static int hist_browser__fprintf_callchain_node_rb_tree(struct hist_browser *bro
                remaining -= cumul;
 
                list_for_each_entry(chain, &child->val, list) {
-                       char ipstr[BITS_PER_LONG / 4 + 1], *alloc_str;
+                       char bf[1024], *alloc_str;
                        const char *str;
                        bool was_first = first;
 
@@ -842,7 +852,8 @@ static int hist_browser__fprintf_callchain_node_rb_tree(struct hist_browser *bro
                        folded_sign = callchain_list__folded(chain);
 
                        alloc_str = NULL;
-                       str = callchain_list__sym_name(chain, ipstr, sizeof(ipstr));
+                       str = callchain_list__sym_name(chain, bf, sizeof(bf),
+                                                      browser->show_dso);
                        if (was_first) {
                                double percent = cumul * 100.0 / new_total;
 
@@ -880,10 +891,10 @@ static int hist_browser__fprintf_callchain_node(struct hist_browser *browser,
        int printed = 0;
 
        list_for_each_entry(chain, &node->val, list) {
-               char ipstr[BITS_PER_LONG / 4 + 1], *s;
+               char bf[1024], *s;
 
                folded_sign = callchain_list__folded(chain);
-               s = callchain_list__sym_name(chain, ipstr, sizeof(ipstr));
+               s = callchain_list__sym_name(chain, bf, sizeof(bf), browser->show_dso);
                printed += fprintf(fp, "%*s%c %s\n", offset, " ", folded_sign, s);
        }
 
@@ -1133,6 +1144,9 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
                        continue;
                case 'd':
                        goto zoom_dso;
+               case 'V':
+                       browser->show_dso = !browser->show_dso;
+                       continue;
                case 't':
                        goto zoom_thread;
                case '/':
@@ -1164,6 +1178,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
                                        "d             Zoom into current DSO\n"
                                        "t             Zoom into current Thread\n"
                                        "P             Print histograms to perf.hist.N\n"
+                                       "V             Verbose (DSO names in callchains, etc)\n"
                                        "/             Filter symbol by name");
                        continue;
                case K_ENTER: