Messages in this thread Patch in this message | | | From | Namhyung Kim <> | Subject | [RFC/PATCH] perf record: Save build-id of DSO in callchains | Date | Mon, 23 Mar 2015 10:18:03 +0900 |
| |
Currently the build-id only recorded for sampled location, but in order to correctly view/annotate callchains it might need the build-id's of callchains too. I guess this choice was due to a performance impact on the post-processing at perf record time.
Add a new option --buildid-callchain to record this info.
$ perf record -o xxx -g -- perf > /dev/null $ perf buildid-list -i xxx 6ebcee76c4b04895598b4df86ec445c49fc137a2 /lib/modules/3.18.6-1-ARCH/build/vmlinux fc0759b71584d2513b04f1b530965a61b5e499e2 /usr/lib/ld-2.21.so
$ perf record -o yyy -g --buildid-callchain -- perf > /dev/null $ perf buildid-list -i yyy 6ebcee76c4b04895598b4df86ec445c49fc137a2 /lib/modules/3.18.6-1-ARCH/build/vmlinux 4235ae90856f98d2746529648a3339ebfa6ede43 /home/namhyung/project/linux/tools/perf/perf fc0759b71584d2513b04f1b530965a61b5e499e2 /usr/lib/ld-2.21.so 9ac81172d5ff96f40d984fe7c10073a98f1a6b2e /usr/lib/libc-2.21.so 864583bb881db1d260660a30a51b3f5022cd538b /usr/lib/libnuma.so.1.0.0
Signed-off-by: Namhyung Kim <namhyung@kernel.org> --- tools/perf/builtin-record.c | 2 ++ tools/perf/util/build-id.c | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-)
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 5a2ff510b75b..a43b1d96714b 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c @@ -841,6 +841,8 @@ struct option __record_options[] = { "Sample machine registers on interrupt"), OPT_BOOLEAN(0, "running-time", &record.opts.running_time, "Record running/enabled time of read (:S) events"), + OPT_BOOLEAN(0, "buildid-callchain", &symbol_conf.use_callchain, + "Record build-id of DSOs in callchain"), OPT_END() }; diff --git a/tools/perf/util/build-id.c b/tools/perf/util/build-id.c index f7fb2587df69..401357f3425a 100644 --- a/tools/perf/util/build-id.c +++ b/tools/perf/util/build-id.c @@ -17,6 +17,7 @@ #include "tool.h" #include "header.h" #include "vdso.h" +#include "callchain.h" static bool no_buildid_cache; @@ -24,13 +25,15 @@ static bool no_buildid_cache; int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused, union perf_event *event, struct perf_sample *sample, - struct perf_evsel *evsel __maybe_unused, + struct perf_evsel *evsel, struct machine *machine) { struct addr_location al; u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; struct thread *thread = machine__findnew_thread(machine, sample->pid, sample->tid); + int err; + struct callchain_cursor_node *node; if (thread == NULL) { pr_err("problem processing %d event, skipping it.\n", @@ -43,6 +46,25 @@ int build_id__mark_dso_hit(struct perf_tool *tool __maybe_unused, if (al.map != NULL) al.map->dso->hit = 1; + if (!symbol_conf.use_callchain) + return 0; + + err = sample__resolve_callchain(sample, NULL, evsel, &al, + PERF_MAX_STACK_DEPTH); + if (err) + return err; + + callchain_cursor_commit(&callchain_cursor); + node = callchain_cursor_current(&callchain_cursor); + + while (node) { + if (node->map) + node->map->dso->hit = 1; + + callchain_cursor_advance(&callchain_cursor); + node = callchain_cursor_current(&callchain_cursor); + } + return 0; } -- 2.3.3
| |