With --call-graph option, a user can choose to display call chains with a specific sort_key. The sort_key can be either: function, address or srcline. By default, when the address is specified as the sort_key, the offset (i.e. symbol + offset) is provided in decimal (base 10) form. This is because in __get_srcline() we use PRIu64 to display the offset. This may or may not be desirable.
This patch adds a new option --hex, to change the offset format to hexidecimal. Note, this can only be used with the -g, --call-graph option when address is specified as a sort_key. When this option is not specified, the default behavior is used, which is to display the offset in decimal form. Before: $ ./perf report -n --fields=overhead,sample,period,pid,symbol --stdio \ > -g graph,callee,address --percent-limit 10 --no-children [ ... ] 10.87% 1 506940477 15:migration/3 [k] _spin_trylock | ---_spin_trylock +13 double_lock_balance +48 schedule +2007 migration_thread +613 kthread +158 child_rip +10 After: $ ./perf report -n --fields=overhead,sample,period,pid,symbol --stdio \ > -g graph,callee,address --percent-limit 10 --hex --no-children [ ... ] 10.87% 1 506940477 15:migration/3 [k] _spin_trylock | ---_spin_trylock +0xd double_lock_balance +0x30 schedule +0x7d7 migration_thread +0x265 kthread +0x9e child_rip +0xa Signed-off-by: Aaron Tomlin <atom...@redhat.com> --- tools/perf/Documentation/perf-report.txt | 4 ++++ tools/perf/builtin-report.c | 2 ++ tools/perf/util/srcline.c | 6 ++++-- tools/perf/util/srcline.h | 1 + 4 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tools/perf/Documentation/perf-report.txt b/tools/perf/Documentation/perf-report.txt index ddde2b5..589435a 100644 --- a/tools/perf/Documentation/perf-report.txt +++ b/tools/perf/Documentation/perf-report.txt @@ -386,6 +386,10 @@ OPTIONS sum of shown entries will be always 100%. "absolute" means it retains the original value before and after the filter is applied. +--hex:: + When address is specified as a sort_key, show the offset in + hexidecimal form. (Default: decimal) + --header:: Show header information in the perf.data file. This includes various information like hostname, OS and perf version, cpu/mem diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index af5dd03..7820e55 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c @@ -866,6 +866,8 @@ int cmd_report(int argc, const char **argv) itrace_parse_synth_opts), OPT_BOOLEAN(0, "full-source-path", &srcline_full_filename, "Show full source file name path for source lines"), + OPT_BOOLEAN(0, "hex", &show_hex_offset, + "When address is specified as a sort_key, show the offset in hexidecimal form"), OPT_BOOLEAN(0, "show-ref-call-graph", &symbol_conf.show_ref_callgraph, "Show callgraph from reference event"), OPT_INTEGER(0, "socket-filter", &report.socket_filter, diff --git a/tools/perf/util/srcline.c b/tools/perf/util/srcline.c index d19f05c..98fc911 100644 --- a/tools/perf/util/srcline.c +++ b/tools/perf/util/srcline.c @@ -15,6 +15,7 @@ #include "symbol.h" bool srcline_full_filename; +bool show_hex_offset; static const char *dso__name(struct dso *dso) { @@ -535,8 +536,9 @@ char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym, strndup(sym->name, sym->namelen) : NULL; if (sym) { - if (asprintf(&srcline, "%s+%" PRIu64, show_sym ? sym->name : "", - addr - sym->start) < 0) + if (asprintf(&srcline, + show_hex_offset ? "%s+%#" PRIx64 : "%s+%" PRIu64, + show_sym ? sym->name : "", addr - sym->start) < 0) return SRCLINE_UNKNOWN; } else if (asprintf(&srcline, "%s[%" PRIx64 "]", dso->short_name, addr) < 0) return SRCLINE_UNKNOWN; diff --git a/tools/perf/util/srcline.h b/tools/perf/util/srcline.h index 847b708..1bca068 100644 --- a/tools/perf/util/srcline.h +++ b/tools/perf/util/srcline.h @@ -10,6 +10,7 @@ struct dso; struct symbol; extern bool srcline_full_filename; +extern bool show_hex_offset; char *get_srcline(struct dso *dso, u64 addr, struct symbol *sym, bool show_sym, bool show_addr); char *__get_srcline(struct dso *dso, u64 addr, struct symbol *sym, -- 2.9.5