perf inject: add jitdump mmap injection support
Arnaldo Carvalho de Melo
maintainerEm Fri, Jan 22, 2016 at 01:22:51PM -0800, Stephane Eranian escreveu:
Quoted 16 lines
Quoted 14 lines · Arnaldo Carvalho de Melo
Em Mon, Nov 30, 2015 at 10:02:21AM +0100, Stephane Eranian escreveu:
Quoted 12 lines
This patch adds a --jit/-j option to perf inject.
This options injects MMAP records into the perf.data file to cover the jitted code mmaps. It also emits ELF images for each function in the jidump file. Those images are created where the jitdump file is. The MMAP records point to that location as well.
Typical flow:
$ perf record -k mono -- java -agentpath:libpjvmti.so java_class $ perf inject --jit -i perf.data -o perf.data.jitted $ perf report -i perf.data.jitted
Quoted 6 lines
Quoted 3 lines
So, it fails 'make -C
tools/perfbuild-test', specifically the one where we ask for aNO_LIBELFbuild, trying to fix:I have rebase to tip.git last night. Will try your branch today. Will add a couple of minor adjustments and also better documentation on how to use it.
Ok, but please work on top of my branch, that I'll push soon, for instance, I had to fold the patch below, to fix the NO_LIBELF=1 case, so, when one builds that way perf inject -h will say:
[acme@jouet linux]$ tools/perf/perf inject -h
Usage: perf inject [<options>]
-b, --build-ids Inject build-ids into the output stream
-f, --force don't complain, do it
-i, --input <file> input file name
-j, --jit merge jitdump files into perf.data file
(not built-in because NO_LIBELF=1)
-o, --output <file> output file name
-s, --sched-stat Merge sched-stat and sched-switch for gettingevents where and how long tasks slept
-v, --verbose be more verbose (show build ids, etc)
--itrace[=<opts>]
Instruction Tracing options
--kallsyms <file>
kallsyms pathname
--strip strip non-synthesized events (use with
--itrace)
[acme@jouet linux]$
I did some other changes and carved out two bits into separate patches, will soon push what I have to a perf/jit branch in my tree so that you can take a look.
- Arnaldo
---------------------------------------------------------
tools/perf/builtin-inject.c +14 -4
@@ -73,12 +73,14 @@ static int perf_event__repipe_oe_synth(struct perf_tool *tool,return perf_event__repipe_synth (tool, event); } +#ifdef HAVE_LIBELF_SUPPORT static int perf_event__drop_oe (struct perf_tool *tool__maybe_unused ,union perf_event *event__maybe_unused ,struct ordered_events *oe__maybe_unused ) {return 0 ; } +#endif static int perf_event__repipe_op2_synth(struct perf_tool *tool, union perf_event *event,
@@ -243,6 +245,7 @@ static int perf_event__repipe_mmap(struct perf_tool *tool,return err; } +#ifdef HAVE_LIBELF_SUPPORT static int perf_event__jit_repipe_mmap(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,
@@ -261,6 +264,7 @@ static int perf_event__jit_repipe_mmap(struct perf_tool *tool, }return perf_event__repipe_mmap (tool, event, sample, machine); } +#endif static int perf_event__repipe_mmap2(struct perf_tool *tool, union perf_event *event,
@@ -275,6 +279,7 @@ static int perf_event__repipe_mmap2(struct perf_tool *tool,return err; } +#ifdef HAVE_LIBELF_SUPPORT static int perf_event__jit_repipe_mmap2(struct perf_tool *tool, union perf_event *event, struct perf_sample *sample,
@@ -293,6 +298,7 @@ static int perf_event__jit_repipe_mmap2(struct perf_tool *tool, }return perf_event__repipe_mmap2 (tool, event, sample, machine); } +#endif static int perf_event__repipe_fork(struct perf_tool *tool, union perf_event *event,
@@ -711,6 +717,7 @@ static int __cmd_inject(struct perf_inject *inject)return ret; } +#ifdef HAVE_LIBELF_SUPPORT static int jit_validate_events (struct perf_session *session) {
@@ -725,6 +732,7 @@ jit_validate_events(struct perf_session *session) }return 0 ; } +#endif int cmd_inject (int argc,const char **argv,const char *prefix__maybe_unused ) {
@@ -765,7 +773,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) };int ret; -const struct option options[] = { +struct option options[] = {OPT_BOOLEAN ('b' ,"build-ids" , &inject.build_ids,"Inject build-ids into the output stream" ), OPT_STRING('i', "input", &inject.input_name, "file",
@@ -792,7 +800,9 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)"perf inject [<options>]" , NULL }; - +#ifndef HAVE_LIBELF_SUPPORT +set_option_nobuild (options,'j' ,"jit" ,"NO_LIBELF=1" , true); +#endif argc =parse_options (argc, argv, options, inject_usage,0 );/*
@@ -828,7 +838,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused) inject.tool.ordered_events = true; inject.tool.ordering_requires_timestamps = true; } - +#ifdef HAVE_LIBELF_SUPPORT if (inject.jit_mode) {/* * validate event is using the correct clockid
@@ -847,7 +857,7 @@ int cmd_inject(int argc, const char **argv, const char *prefix __maybe_unused)*/ inject.tool.finished_round = perf_event__drop_oe; } - +#endif ret =symbol__init (&inject.session->header.env);if (ret <0 ) goto out_delete;
tools/perf/util/Build +2 -2
@@ -106,8 +106,8 @@ libperf-y += scripting-engines/ libperf-$(CONFIG_ZLIB) += zlib.o libperf-$(CONFIG_LZMA) += lzma.o libperf-y += demangle-java.o -libperf-y += jitdump.o -libperf-y += genelf.o +libperf-$(CONFIG_LIBELF) += jitdump.o +libperf-$(CONFIG_LIBELF) += genelf.o CFLAGS_config.o += -DETC_PERFCONFIG="BUILD_STR($(ETC_PERFCONFIG_SQ))"
----- End forwarded message -----