Messages in this thread | | | Subject | Re: [PATCH v2 2/9] perf script: Add options for custom vdso path | From | Hekuang <> | Date | Wed, 11 May 2016 09:33:31 +0800 |
| |
在 2016/5/10 21:44, Arnaldo Carvalho de Melo 写道: > Em Tue, May 10, 2016 at 07:40:30AM +0000, He Kuang escreveu: >> When unwinding callchains on a different machine, vdso info should be >> provided so the unwind process won't be interrupted if address falls >> into vdso region. >> >> Currently, perf does try to read vdso binary in '.debug' folder, but >> the filename of the vdso file is generated randomly based on >> VDSO__TEMP_FILE_NAME template, such a filename is not reliable and >> users need a way to provide the path of their own vdso binary file. > But this becomes one more burden to the user :-\ Why not calculate a > build-id from the VDSO file contents, copy it to > ~/.debug/.build-id/ab/cdef01020304 and insert that into the perf.data > file so that at analysis time we do all this automatically? > > We can of course have a way to manually provide it, but having it as the > main way for users doesn't seem a good interface. Am I missing > something? > > - Arnaldo
OK, I'll try as you suggested! > >> Signed-off-by: He Kuang <hekuang@huawei.com> >> --- >> tools/perf/builtin-script.c | 2 ++ >> tools/perf/util/dso.c | 7 +++++++ >> tools/perf/util/dso.h | 1 + >> tools/perf/util/symbol.c | 1 + >> tools/perf/util/symbol.h | 1 + >> 5 files changed, 12 insertions(+) >> >> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c >> index 8f6ab2a..c88b547 100644 >> --- a/tools/perf/builtin-script.c >> +++ b/tools/perf/builtin-script.c >> @@ -2001,6 +2001,8 @@ int cmd_script(int argc, const char **argv, const char *prefix __maybe_unused) >> "file", "vmlinux pathname"), >> OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, >> "file", "kallsyms pathname"), >> + OPT_STRING(0, "vdso", &symbol_conf.vdso_name, >> + "file", "vdso pathname"), >> OPT_BOOLEAN('G', "hide-call-graph", &no_callchain, >> "When printing symbols do not display call chain"), >> OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory", >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c >> index 8e639543..6ed1cce 100644 >> --- a/tools/perf/util/dso.c >> +++ b/tools/perf/util/dso.c >> @@ -13,6 +13,7 @@ char dso__symtab_origin(const struct dso *dso) >> static const char origin[] = { >> [DSO_BINARY_TYPE__KALLSYMS] = 'k', >> [DSO_BINARY_TYPE__VMLINUX] = 'v', >> + [DSO_BINARY_TYPE__VDSO] = 'D', >> [DSO_BINARY_TYPE__JAVA_JIT] = 'j', >> [DSO_BINARY_TYPE__DEBUGLINK] = 'l', >> [DSO_BINARY_TYPE__BUILD_ID_CACHE] = 'B', >> @@ -113,6 +114,11 @@ int dso__read_binary_type_filename(const struct dso *dso, >> build_id_hex, build_id_hex + 2); >> break; >> >> + case DSO_BINARY_TYPE__VDSO: >> + { >> + snprintf(filename, size, "%s", symbol_conf.vdso_name); >> + break; >> + } >> case DSO_BINARY_TYPE__VMLINUX: >> case DSO_BINARY_TYPE__GUEST_VMLINUX: >> case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: >> @@ -487,6 +493,7 @@ static void try_to_open_dso(struct dso *dso, struct machine *machine) >> enum dso_binary_type binary_type_data[] = { >> DSO_BINARY_TYPE__BUILD_ID_CACHE, >> DSO_BINARY_TYPE__SYSTEM_PATH_DSO, >> + DSO_BINARY_TYPE__VDSO, >> DSO_BINARY_TYPE__NOT_FOUND, >> }; >> int i = 0; >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h >> index 0953280..05fac98 100644 >> --- a/tools/perf/util/dso.h >> +++ b/tools/perf/util/dso.h >> @@ -30,6 +30,7 @@ enum dso_binary_type { >> DSO_BINARY_TYPE__KCORE, >> DSO_BINARY_TYPE__GUEST_KCORE, >> DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO, >> + DSO_BINARY_TYPE__VDSO, >> DSO_BINARY_TYPE__NOT_FOUND, >> }; >> >> diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c >> index e7588dc..4630751 100644 >> --- a/tools/perf/util/symbol.c >> +++ b/tools/perf/util/symbol.c >> @@ -1363,6 +1363,7 @@ static bool dso__is_compatible_symtab_type(struct dso *dso, bool kmod, >> case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: >> case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: >> case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: >> + case DSO_BINARY_TYPE__VDSO: >> return !kmod && dso->kernel == DSO_TYPE_USER; >> >> case DSO_BINARY_TYPE__KALLSYMS: >> diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h >> index c8b7544..4e6910e 100644 >> --- a/tools/perf/util/symbol.h >> +++ b/tools/perf/util/symbol.h >> @@ -114,6 +114,7 @@ struct symbol_conf { >> report_hierarchy; >> const char *vmlinux_name, >> *kallsyms_name, >> + *vdso_name, >> *source_prefix, >> *field_sep; >> const char *default_guest_vmlinux_name, >> -- >> 1.8.5.2
| |