perf script: Add option to stop printing callchain
PATCH 1/1 perf script: Add option to stop printing callchain
From: David Ahern <[email protected]>
Allow user to specify list of symbols which cause the dump of callchains to stop at that symbol.
Signed-off-by David Ahern <[email protected]>
--- tools/perf/Documentation/perf-script.txt | 3 +++ tools/perf/builtin-script.c | 2 ++ tools/perf/util/evsel_fprintf.c | 8 ++++++++ tools/perf/util/symbol.c | 8 ++++++++ tools/perf/util/symbol.h | 6 ++++-- 5 files changed, 25 insertions(+), 2 deletions(-)
tools/perf/Documentation/perf-script.txt +3 -0
@@ -212,6 +212,9 @@ OPTIONS --hide-call-graph:: When printing symbols do not display call chain. +--stop-bt:: + Stop display of callgraph at these symbols + -C:: --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can be provided as a comma-separated list with no space: 0,1. Ranges of
tools/perf/builtin-script.c +2 -0
@@ -2151,6 +2151,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) "system-wide collection from all CPUs"),OPT_STRING ('S' ,"symbols" , &symbol_conf.sym_list_str,"symbol[,symbol...]" ,"only consider these symbols" ), +OPT_STRING (0 ,"stop-bt" , &symbol_conf.bt_stop_list_str,"symbol[,symbol...]" , +"Stop display of callgraph at these symbols" ),OPT_STRING ('C' ,"cpu" , &cpu_list,"cpu" ,"list of cpus to profile" ),OPT_STRING ('c' ,"comms" , &symbol_conf.comm_list_str,"comm[,comm...]" , "only display events for these comms"),
tools/perf/util/evsel_fprintf.c +8 -0
@@ -162,6 +162,14 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,if (!print_oneline) printed +=fprintf (fp,"\n" ); +if (symbol_conf.bt_stop_list && + node->sym && + node->sym->name && +strlist__has_entry (symbol_conf.bt_stop_list, + node->sym->name)) { +break ; + } +callchain_cursor_advance (cursor); first = false; }
tools/perf/util/symbol.c +8 -0
@@ -2032,6 +2032,10 @@ int symbol__init(struct perf_env *env) symbol_conf.sym_list_str, "symbol") < 0) goto out_free_tid_list; +if (setup_list (&symbol_conf.bt_stop_list, + symbol_conf.bt_stop_list_str,"symbol" ) <0 ) + goto out_free_sym_list; +/* * A path to symbols of "/" is identical to "" * reset here for simplicity.
@@ -2049,6 +2053,8 @@ int symbol__init(struct perf_env *env) symbol_conf.initialized = true;return 0 ; +out_free_sym_list: +strlist__delete (symbol_conf.sym_list); out_free_tid_list:intlist__delete (symbol_conf.tid_list); out_free_pid_list:
@@ -2064,6 +2070,7 @@ void symbol__exit(void) {if (!symbol_conf.initialized)return ; +strlist__delete (symbol_conf.bt_stop_list);strlist__delete (symbol_conf.sym_list);strlist__delete (symbol_conf.dso_list);strlist__delete (symbol_conf.comm_list);
@@ -2071,6 +2078,7 @@ void symbol__exit(void)intlist__delete (symbol_conf.pid_list);vmlinux_path__exit (); symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list =NULL ; + symbol_conf.bt_stop_list =NULL ; symbol_conf.initialized = false; }
tools/perf/util/symbol.h +4 -2
@@ -131,14 +131,16 @@ struct symbol_conf { *pid_list_str, *tid_list_str, *sym_list_str, - *col_width_list_str; + *col_width_list_str, + *bt_stop_list_str;struct strlist *dso_list, *comm_list, *sym_list, *dso_from_list, *dso_to_list, *sym_from_list, - *sym_to_list; + *sym_to_list, + *bt_stop_list;struct intlist *pid_list, *tid_list;const char *symfs;
Signature · 1 line
2.7.4 (Apple Git-66)
Arnaldo Carvalho de Melo
maintainerEm Fri, Nov 25, 2016 at 09:36:27AM -0700, David Ahern escreveu:
Quoted 4 lines
From: David Ahern <[email protected]>
Allow user to specify list of symbols which cause the dump of callchains to stop at that symbol.
Not applying, please refresh acme/perf/core and resend,
Thanks,
- Arnaldo
Quoted 120 lines
Signed-off-by David Ahern <[email protected]>--- tools/perf/Documentation/perf-script.txt | 3 +++ tools/perf/builtin-script.c | 2 ++ tools/perf/util/evsel_fprintf.c | 8 ++++++++ tools/perf/util/symbol.c | 8 ++++++++ tools/perf/util/symbol.h | 6 ++++-- 5 files changed, 25 insertions(+), 2 deletions(-)tools/perf/Documentation/perf-script.txt +3
-0@@ -212,6 +212,9 @@ OPTIONS --hide-call-graph:: When printing symbols do not display call chain. +--stop-bt:: + Stop display of callgraph at these symbols + -C:: --cpu:: Only report samples for the list of CPUs provided. Multiple CPUs can be provided as a comma-separated list with no space: 0,1. Ranges oftools/perf/builtin-script.c +2
-0@@ -2151,6 +2151,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) "system-wide collection from all CPUs"),OPT_STRING ('S' ,"symbols" , &symbol_conf.sym_list_str,"symbol[,symbol...]" ,"only consider these symbols" ), +OPT_STRING (0 ,"stop-bt" , &symbol_conf.bt_stop_list_str,"symbol[,symbol...]" , +"Stop display of callgraph at these symbols" ),OPT_STRING ('C' ,"cpu" , &cpu_list,"cpu" ,"list of cpus to profile" ),OPT_STRING ('c' ,"comms" , &symbol_conf.comm_list_str,"comm[,comm...]" , "only display events for these comms"),tools/perf/util/evsel_fprintf.c +8
-0@@ -162,6 +162,14 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,if (!print_oneline) printed +=fprintf (fp,"\n" ); +if (symbol_conf.bt_stop_list && + node->sym && + node->sym->name && +strlist__has_entry (symbol_conf.bt_stop_list, + node->sym->name)) { +break ; + } +callchain_cursor_advance (cursor); first = false; }tools/perf/util/symbol.c +8
-0@@ -2032,6 +2032,10 @@ int symbol__init(struct perf_env *env) symbol_conf.sym_list_str, "symbol") < 0) goto out_free_tid_list; +if (setup_list (&symbol_conf.bt_stop_list, + symbol_conf.bt_stop_list_str,"symbol" ) <0 ) + goto out_free_sym_list; +/* * A path to symbols of "/" is identical to "" * reset here for simplicity. @@ -2049,6 +2053,8 @@ int symbol__init(struct perf_env *env) symbol_conf.initialized = true;return 0 ; +out_free_sym_list: +strlist__delete (symbol_conf.sym_list); out_free_tid_list:intlist__delete (symbol_conf.tid_list); out_free_pid_list:@@ -2064,6 +2070,7 @@ void symbol__exit(void) {if (!symbol_conf.initialized)return ; +strlist__delete (symbol_conf.bt_stop_list);strlist__delete (symbol_conf.sym_list);strlist__delete (symbol_conf.dso_list);strlist__delete (symbol_conf.comm_list);@@ -2071,6 +2078,7 @@ void symbol__exit(void)intlist__delete (symbol_conf.pid_list);vmlinux_path__exit (); symbol_conf.sym_list = symbol_conf.dso_list = symbol_conf.comm_list =NULL ; + symbol_conf.bt_stop_list =NULL ; symbol_conf.initialized = false; }tools/perf/util/symbol.h +4
-2@@ -131,14 +131,16 @@ struct symbol_conf { *pid_list_str, *tid_list_str, *sym_list_str, - *col_width_list_str; + *col_width_list_str, + *bt_stop_list_str;struct strlist *dso_list, *comm_list, *sym_list, *dso_from_list, *dso_to_list, *sym_from_list, - *sym_to_list; + *sym_to_list, + *bt_stop_list;struct intlist *pid_list, *tid_list;const char *symfs;Signature · 1 line
2.7.4 (Apple Git-66)