perf script: Add --inline option for debugging
The --inline option is to show inlined functions in callchains. For example: $ perf script a.out 5644 11611.467597: 309961 cycles:u: 790 main (/home/namhyung/tmp/perf/a.out) 20511 __libc_start_main (/usr/lib/libc-2.25.so) 8ba _start (/home/namhyung/tmp/perf/a.out) ... $ perf script --inline a.out 5644 11611.467597: 309961 cycles:u: 790 main (/home/namhyung/tmp/perf/a.out) std::__detail::_Adaptor<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul>, double>::operator() std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > std::uniform_real_distribution<double>::operator()<std::linear_congruential_engine<unsigned long, 16807ul, 0ul, 2147483647ul> > main 20511 __libc_start_main (/usr/lib/libc-2.25.so) 8ba _start (/home/namhyung/tmp/perf/a.out) ... Reviewed-and-tested-by: Milian Wolff <milian.wolff@kdab.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@kernel.org> Cc: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Jin Yao <yao.jin@linux.intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Milian Wolff <milian.wolff@kdab.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: kernel-team@lge.com Link: http://lkml.kernel.org/r/20170524062129.32529-5-namhyung@kernel.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
1982ad48fc
commit
325fbff51f
3 changed files with 39 additions and 0 deletions
|
@ -311,6 +311,10 @@ include::itrace.txt[]
|
|||
Set the maximum number of program blocks to print with brstackasm for
|
||||
each sample.
|
||||
|
||||
--inline::
|
||||
If a callgraph address belongs to an inlined function, the inline stack
|
||||
will be printed. Each entry has function name and file/line.
|
||||
|
||||
SEE ALSO
|
||||
--------
|
||||
linkperf:perf-record[1], linkperf:perf-script-perl[1],
|
||||
|
|
|
@ -2494,6 +2494,8 @@ int cmd_script(int argc, const char **argv)
|
|||
"Enable kernel symbol demangling"),
|
||||
OPT_STRING(0, "time", &script.time_str, "str",
|
||||
"Time span of interest (start,stop)"),
|
||||
OPT_BOOLEAN(0, "inline", &symbol_conf.inline_name,
|
||||
"Show inline function"),
|
||||
OPT_END()
|
||||
};
|
||||
const char * const script_subcommands[] = { "record", "report", NULL };
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "map.h"
|
||||
#include "strlist.h"
|
||||
#include "symbol.h"
|
||||
#include "srcline.h"
|
||||
|
||||
static int comma_fprintf(FILE *fp, bool *first, const char *fmt, ...)
|
||||
{
|
||||
|
@ -168,6 +169,38 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment,
|
|||
if (!print_oneline)
|
||||
printed += fprintf(fp, "\n");
|
||||
|
||||
if (symbol_conf.inline_name && node->map) {
|
||||
struct inline_node *inode;
|
||||
|
||||
addr = map__rip_2objdump(node->map, node->ip),
|
||||
inode = dso__parse_addr_inlines(node->map->dso, addr);
|
||||
|
||||
if (inode) {
|
||||
struct inline_list *ilist;
|
||||
|
||||
list_for_each_entry(ilist, &inode->val, list) {
|
||||
if (print_arrow)
|
||||
printed += fprintf(fp, " <-");
|
||||
|
||||
/* IP is same, just skip it */
|
||||
if (print_ip)
|
||||
printed += fprintf(fp, "%c%16s",
|
||||
s, "");
|
||||
if (print_sym)
|
||||
printed += fprintf(fp, " %s",
|
||||
ilist->funcname);
|
||||
if (print_srcline)
|
||||
printed += fprintf(fp, "\n %s:%d",
|
||||
ilist->filename,
|
||||
ilist->line_nr);
|
||||
if (!print_oneline)
|
||||
printed += fprintf(fp, "\n");
|
||||
}
|
||||
|
||||
inline_node__delete(inode);
|
||||
}
|
||||
}
|
||||
|
||||
if (symbol_conf.bt_stop_list &&
|
||||
node->sym &&
|
||||
strlist__has_entry(symbol_conf.bt_stop_list,
|
||||
|
|
Loading…
Reference in a new issue