* [PATCH v5 0/3] perf script: Have consistent output for symbol address
@ 2023-04-18 3:18 Changbin Du
2023-04-18 3:18 ` [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain Changbin Du
` (2 more replies)
0 siblings, 3 replies; 15+ messages in thread
From: Changbin Du @ 2023-04-18 3:18 UTC (permalink / raw)
To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar
Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim,
Ian Rogers, Adrian Hunter, linux-perf-users, linux-kernel,
Hui Wang, Changbin Du
The goal of this change is to achieve consistent output for symbol address.
Before this, the raw ip is printed for non-callchain and dso offset for
callchain. Mostly what we expect is the raw ip.
This patch does two changes:
- Always print raw ip for resolved symbols.
- Add a new 'dsoff' field if we really need the dso offset, and the
offset is appended to dso name.
v5:
o add helper map__fprintf_dsoname_dsoff() to eliminate repeated dso printing code. (Adrian)
o do not print offset for kernel dso (a.k.a [kernel.kallsyms])
v4:
o also print 'dsoff' for brstack,brstacksym,brstackoff,etc.
v3:
o 'dsoff' implys 'dso' field. (Namhyung)
v2:
o split into two patches. (Adrian)
o do not print offset for unresolved symbols. (Adrian)
Changbin Du (3):
perf script: print raw ip instead of binary offset for callchain
perf: add helper map__fprintf_dsoname_dsoff
perf: script: add new output field 'dsoff' to print dso offset
tools/perf/Documentation/perf-script.txt | 2 +-
tools/perf/builtin-script.c | 60 ++++++++++--------------
tools/perf/util/evsel_fprintf.c | 25 ++++------
tools/perf/util/evsel_fprintf.h | 1 +
tools/perf/util/map.c | 13 +++++
tools/perf/util/map.h | 1 +
6 files changed, 48 insertions(+), 54 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 15+ messages in thread* [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain 2023-04-18 3:18 [PATCH v5 0/3] perf script: Have consistent output for symbol address Changbin Du @ 2023-04-18 3:18 ` Changbin Du 2023-04-24 5:24 ` Adrian Hunter 2023-04-18 3:18 ` [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff Changbin Du 2023-04-18 3:18 ` [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset Changbin Du 2 siblings, 1 reply; 15+ messages in thread From: Changbin Du @ 2023-04-18 3:18 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, Adrian Hunter, linux-perf-users, linux-kernel, Hui Wang, Changbin Du Before this, the raw ip is printed for non-callchain and dso offset for callchain. This inconsistent output for address may confuse people. And mostly what we expect is the raw ip. 'dso offset' is printed in callchain: $ perf script ... ls 1341034 2739463.008343: 2162417 cycles: ffffffff99d657a7 [unknown] ([unknown]) ffffffff99e00b67 [unknown] ([unknown]) 235d3 memset+0x53 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) # dso offset a61b _dl_map_object+0x1bb (/usr/lib/x86_64-linux-gnu/ld-2.31.so) raw ip is printed for non-callchain: $ perf script -G ... ls 1341034 2739463.008876: 2053304 cycles: ffffffffc1596923 [unknown] ([unknown]) ls 1341034 2739463.009381: 1917049 cycles: 14def8e149e6 __strcoll_l+0xd96 (/usr/lib/x86_64-linux-gnu/libc-2.31.so) # raw ip Let's have consistent output for it. Later I'll add a new field 'dsoff' to print dso offset. Signed-off-by: Changbin Du <changbin.du@huawei.com> --- tools/perf/util/evsel_fprintf.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c index a09ac00810b7..cc80ec554c0a 100644 --- a/tools/perf/util/evsel_fprintf.c +++ b/tools/perf/util/evsel_fprintf.c @@ -153,13 +153,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, if (map) addr = map__map_ip(map, node->ip); - if (print_ip) { - /* Show binary offset for userspace addr */ - if (map && !map__dso(map)->kernel) - printed += fprintf(fp, "%c%16" PRIx64, s, addr); - else - printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); - } + if (print_ip) + printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); if (print_sym) { printed += fprintf(fp, " "); -- 2.25.1 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain 2023-04-18 3:18 ` [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain Changbin Du @ 2023-04-24 5:24 ` Adrian Hunter 0 siblings, 0 replies; 15+ messages in thread From: Adrian Hunter @ 2023-04-24 5:24 UTC (permalink / raw) To: Changbin Du, Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang On 18/04/23 06:18, Changbin Du wrote: > Before this, the raw ip is printed for non-callchain and dso offset for > callchain. This inconsistent output for address may confuse people. And > mostly what we expect is the raw ip. > > 'dso offset' is printed in callchain: > $ perf script > ... > ls 1341034 2739463.008343: 2162417 cycles: > ffffffff99d657a7 [unknown] ([unknown]) > ffffffff99e00b67 [unknown] ([unknown]) > 235d3 memset+0x53 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) # dso offset > a61b _dl_map_object+0x1bb (/usr/lib/x86_64-linux-gnu/ld-2.31.so) > > raw ip is printed for non-callchain: > $ perf script -G > ... > ls 1341034 2739463.008876: 2053304 cycles: ffffffffc1596923 [unknown] ([unknown]) > ls 1341034 2739463.009381: 1917049 cycles: 14def8e149e6 __strcoll_l+0xd96 (/usr/lib/x86_64-linux-gnu/libc-2.31.so) # raw ip > > Let's have consistent output for it. Later I'll add a new field 'dsoff' to > print dso offset. > > Signed-off-by: Changbin Du <changbin.du@huawei.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > tools/perf/util/evsel_fprintf.c | 9 ++------- > 1 file changed, 2 insertions(+), 7 deletions(-) > > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c > index a09ac00810b7..cc80ec554c0a 100644 > --- a/tools/perf/util/evsel_fprintf.c > +++ b/tools/perf/util/evsel_fprintf.c > @@ -153,13 +153,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, > if (map) > addr = map__map_ip(map, node->ip); > > - if (print_ip) { > - /* Show binary offset for userspace addr */ > - if (map && !map__dso(map)->kernel) > - printed += fprintf(fp, "%c%16" PRIx64, s, addr); > - else > - printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); > - } > + if (print_ip) > + printed += fprintf(fp, "%c%16" PRIx64, s, node->ip); > > if (print_sym) { > printed += fprintf(fp, " "); ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-18 3:18 [PATCH v5 0/3] perf script: Have consistent output for symbol address Changbin Du 2023-04-18 3:18 ` [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain Changbin Du @ 2023-04-18 3:18 ` Changbin Du 2023-04-19 18:58 ` Adrian Hunter 2023-04-24 5:25 ` Adrian Hunter 2023-04-18 3:18 ` [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset Changbin Du 2 siblings, 2 replies; 15+ messages in thread From: Changbin Du @ 2023-04-18 3:18 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, Adrian Hunter, linux-perf-users, linux-kernel, Hui Wang, Changbin Du This adds a helper function map__fprintf_dsoname_dsoff() to print dsoname with optional dso offset. Suggested-by: Adrian Hunter <adrian.hunter@intel.com> Signed-off-by: Changbin Du <changbin.du@huawei.com> --- tools/perf/util/map.c | 13 +++++++++++++ tools/perf/util/map.h | 1 + 2 files changed, 14 insertions(+) diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index d81b6ca18ee9..7da96b41100f 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -445,6 +445,19 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) return fprintf(fp, "%s", dsoname); } +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) +{ + int printed = 0; + + printed += fprintf(fp, " ("); + printed += map__fprintf_dsoname(map, fp); + if (print_off && map && map__dso(map) && !map__dso(map)->kernel) + printed += fprintf(fp, "+0x%" PRIx64, addr); + printed += fprintf(fp, ")"); + + return printed; +} + char *map__srcline(struct map *map, u64 addr, struct symbol *sym) { if (map == NULL) diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h index f89ab7c2d327..4cca211b6e66 100644 --- a/tools/perf/util/map.h +++ b/tools/perf/util/map.h @@ -175,6 +175,7 @@ static inline void __map__zput(struct map **map) size_t map__fprintf(struct map *map, FILE *fp); size_t map__fprintf_dsoname(struct map *map, FILE *fp); +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp); char *map__srcline(struct map *map, u64 addr, struct symbol *sym); int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, FILE *fp); -- 2.25.1 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-18 3:18 ` [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff Changbin Du @ 2023-04-19 18:58 ` Adrian Hunter 2023-04-20 2:55 ` Changbin Du 2023-04-24 5:25 ` Adrian Hunter 1 sibling, 1 reply; 15+ messages in thread From: Adrian Hunter @ 2023-04-19 18:58 UTC (permalink / raw) To: Changbin Du, Arnaldo Carvalho de Melo Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On 18/04/23 06:18, Changbin Du wrote: > This adds a helper function map__fprintf_dsoname_dsoff() to print dsoname > with optional dso offset. > > Suggested-by: Adrian Hunter <adrian.hunter@intel.com> > Signed-off-by: Changbin Du <changbin.du@huawei.com> > --- > tools/perf/util/map.c | 13 +++++++++++++ > tools/perf/util/map.h | 1 + > 2 files changed, 14 insertions(+) > > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > index d81b6ca18ee9..7da96b41100f 100644 > --- a/tools/perf/util/map.c > +++ b/tools/perf/util/map.c > @@ -445,6 +445,19 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > return fprintf(fp, "%s", dsoname); > } > > +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > +{ > + int printed = 0; > + > + printed += fprintf(fp, " ("); > + printed += map__fprintf_dsoname(map, fp); > + if (print_off && map && map__dso(map) && !map__dso(map)->kernel) That will also block vmlinux offsets not just [kernel.kallsyms] Is that what was intended? > + printed += fprintf(fp, "+0x%" PRIx64, addr); > + printed += fprintf(fp, ")"); > + > + return printed; > +} > + > char *map__srcline(struct map *map, u64 addr, struct symbol *sym) > { > if (map == NULL) > diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h > index f89ab7c2d327..4cca211b6e66 100644 > --- a/tools/perf/util/map.h > +++ b/tools/perf/util/map.h > @@ -175,6 +175,7 @@ static inline void __map__zput(struct map **map) > > size_t map__fprintf(struct map *map, FILE *fp); > size_t map__fprintf_dsoname(struct map *map, FILE *fp); > +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp); > char *map__srcline(struct map *map, u64 addr, struct symbol *sym); > int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, > FILE *fp); ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-19 18:58 ` Adrian Hunter @ 2023-04-20 2:55 ` Changbin Du 2023-04-20 8:39 ` Adrian Hunter 0 siblings, 1 reply; 15+ messages in thread From: Changbin Du @ 2023-04-20 2:55 UTC (permalink / raw) To: Adrian Hunter Cc: Changbin Du, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On Wed, Apr 19, 2023 at 09:58:10PM +0300, Adrian Hunter wrote: > On 18/04/23 06:18, Changbin Du wrote: > > This adds a helper function map__fprintf_dsoname_dsoff() to print dsoname > > with optional dso offset. > > > > Suggested-by: Adrian Hunter <adrian.hunter@intel.com> > > Signed-off-by: Changbin Du <changbin.du@huawei.com> > > --- > > tools/perf/util/map.c | 13 +++++++++++++ > > tools/perf/util/map.h | 1 + > > 2 files changed, 14 insertions(+) > > > > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > > index d81b6ca18ee9..7da96b41100f 100644 > > --- a/tools/perf/util/map.c > > +++ b/tools/perf/util/map.c > > @@ -445,6 +445,19 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > > return fprintf(fp, "%s", dsoname); > > } > > > > +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > > +{ > > + int printed = 0; > > + > > + printed += fprintf(fp, " ("); > > + printed += map__fprintf_dsoname(map, fp); > > + if (print_off && map && map__dso(map) && !map__dso(map)->kernel) > > That will also block vmlinux offsets not just [kernel.kallsyms] > Is that what was intended? > Not only vmlinux, modules are also blocked. We'd better print offset for vmlinux and modules. $ sudo perf script -k vmlinux -F +dsoff perf-exec 2531039 4120893.685967: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux) perf-exec 2531039 4120893.685970: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux) perf-exec 2531039 4120893.685972: 9 cycles: ffffffff99094ec4 [unknown] (vmlinux) perf-exec 2531039 4120893.685973: 194 cycles: ffffffff99094ec6 [unknown] (vmlinux) perf-exec 2531039 4120893.685974: 4605 cycles: ffffffff99094ec4 [unknown] (vmlinux) perf-exec 2531039 4120893.685976: 108083 cycles: ffffffff9928e8d0 [unknown] (vmlinux) ls 2531039 4120893.686003: 2197682 cycles: ffffffff993c92bc [unknown] (vmlinux) ls 2531039 4120893.686554: 4497190 cycles: ffffffffc159692b strcasestr+0x7b (/lib/modules/5.15.0-60-generic/extra/isac_ipc.ko) ls 2531039 4120893.687700: 4189758 cycles: ffffffffc18a5d66 delete_net_reject_cache+0x76 (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) ls 2531039 4120893.688786: 3780376 cycles: ffffffffc18a67de delete_net_process_info+0x5e (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) ls 2531039 4120893.689716: 3416607 cycles: ffffffffc18a67de delete_net_process_info+0x5e (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) But I found addr returned by map__dso_map_ip() for 'vmlinux' is not a 'dso offset'. $ sudo perf script -k vmlinux -F +dsoff perf-exec 2531039 4120893.685967: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) perf-exec 2531039 4120893.685970: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) perf-exec 2531039 4120893.685972: 9 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) perf-exec 2531039 4120893.685973: 194 cycles: ffffffff99094ec6 [unknown] (vmlinux+0xffffffff99094ec6) Do you have better idea? -- Cheers, Changbin Du ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-20 2:55 ` Changbin Du @ 2023-04-20 8:39 ` Adrian Hunter 2023-04-21 5:04 ` Changbin Du 0 siblings, 1 reply; 15+ messages in thread From: Adrian Hunter @ 2023-04-20 8:39 UTC (permalink / raw) To: Changbin Du Cc: Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On 20/04/23 05:55, Changbin Du wrote: > On Wed, Apr 19, 2023 at 09:58:10PM +0300, Adrian Hunter wrote: >> On 18/04/23 06:18, Changbin Du wrote: >>> This adds a helper function map__fprintf_dsoname_dsoff() to print dsoname >>> with optional dso offset. >>> >>> Suggested-by: Adrian Hunter <adrian.hunter@intel.com> >>> Signed-off-by: Changbin Du <changbin.du@huawei.com> >>> --- >>> tools/perf/util/map.c | 13 +++++++++++++ >>> tools/perf/util/map.h | 1 + >>> 2 files changed, 14 insertions(+) >>> >>> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c >>> index d81b6ca18ee9..7da96b41100f 100644 >>> --- a/tools/perf/util/map.c >>> +++ b/tools/perf/util/map.c >>> @@ -445,6 +445,19 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) >>> return fprintf(fp, "%s", dsoname); >>> } >>> >>> +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) >>> +{ >>> + int printed = 0; >>> + >>> + printed += fprintf(fp, " ("); >>> + printed += map__fprintf_dsoname(map, fp); >>> + if (print_off && map && map__dso(map) && !map__dso(map)->kernel) >> >> That will also block vmlinux offsets not just [kernel.kallsyms] >> Is that what was intended? >> > Not only vmlinux, modules are also blocked. We'd better print offset for > vmlinux and modules. > > $ sudo perf script -k vmlinux -F +dsoff > perf-exec 2531039 4120893.685967: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux) > perf-exec 2531039 4120893.685970: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux) > perf-exec 2531039 4120893.685972: 9 cycles: ffffffff99094ec4 [unknown] (vmlinux) > perf-exec 2531039 4120893.685973: 194 cycles: ffffffff99094ec6 [unknown] (vmlinux) > perf-exec 2531039 4120893.685974: 4605 cycles: ffffffff99094ec4 [unknown] (vmlinux) > perf-exec 2531039 4120893.685976: 108083 cycles: ffffffff9928e8d0 [unknown] (vmlinux) > ls 2531039 4120893.686003: 2197682 cycles: ffffffff993c92bc [unknown] (vmlinux) > ls 2531039 4120893.686554: 4497190 cycles: ffffffffc159692b strcasestr+0x7b (/lib/modules/5.15.0-60-generic/extra/isac_ipc.ko) > ls 2531039 4120893.687700: 4189758 cycles: ffffffffc18a5d66 delete_net_reject_cache+0x76 (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) > ls 2531039 4120893.688786: 3780376 cycles: ffffffffc18a67de delete_net_process_info+0x5e (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) > ls 2531039 4120893.689716: 3416607 cycles: ffffffffc18a67de delete_net_process_info+0x5e (/lib/modules/5.15.0-60-generic/extra/isac_networkfilter.ko) > > But I found addr returned by map__dso_map_ip() for 'vmlinux' is not a 'dso > offset'. > > $ sudo perf script -k vmlinux -F +dsoff > perf-exec 2531039 4120893.685967: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) > perf-exec 2531039 4120893.685970: 1 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) > perf-exec 2531039 4120893.685972: 9 cycles: ffffffff99094ec4 [unknown] (vmlinux+0xffffffff99094ec4) > perf-exec 2531039 4120893.685973: 194 cycles: ffffffff99094ec6 [unknown] (vmlinux+0xffffffff99094ec6) > > Do you have better idea? > What do you get if you try below diff on top of your patches: diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index c7bf1ac14e90..df0d21141185 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -576,8 +576,11 @@ static void set_print_ip_opts(struct perf_event_attr *attr) if (PRINT_FIELD(DSO)) output[type].print_ip_opts |= EVSEL__PRINT_DSO; - if (PRINT_FIELD(DSOFF)) + if (PRINT_FIELD(DSOFF)) { output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; + /* DSO offset is relative to dso->longname */ + symbol_conf.show_kernel_path = true; + } if (PRINT_FIELD(SYMOFFSET)) output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index a86614599269..19ebfd3468cc 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -67,6 +67,42 @@ char dso__symtab_origin(const struct dso *dso) return origin[dso->symtab_type]; } +bool dso__is_file(const struct dso *dso) +{ + switch (dso->binary_type) { + case DSO_BINARY_TYPE__KALLSYMS: + case DSO_BINARY_TYPE__GUEST_KALLSYMS: + return false; + case DSO_BINARY_TYPE__VMLINUX: + case DSO_BINARY_TYPE__GUEST_VMLINUX: + return true; + case DSO_BINARY_TYPE__JAVA_JIT: + return false; + case DSO_BINARY_TYPE__DEBUGLINK: + case DSO_BINARY_TYPE__BUILD_ID_CACHE: + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: + case DSO_BINARY_TYPE__GUEST_KMODULE: + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: + case DSO_BINARY_TYPE__KCORE: + case DSO_BINARY_TYPE__GUEST_KCORE: + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: + return true; + case DSO_BINARY_TYPE__BPF_PROG_INFO: + case DSO_BINARY_TYPE__BPF_IMAGE: + case DSO_BINARY_TYPE__OOL: + case DSO_BINARY_TYPE__NOT_FOUND: + default: + return false; + } +} + int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, char *root_dir, char *filename, size_t size) diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 0b7c7633b9f6..fb33f5224fb6 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -396,6 +396,8 @@ static inline bool dso__is_kallsyms(struct dso *dso) return dso->kernel && dso->long_name[0] != '/'; } +bool dso__is_file(const struct dso *dso); + void dso__free_a2l(struct dso *dso); enum dso_type dso__type(struct dso *dso, struct machine *machine); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 7da96b41100f..9b79f88d371c 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -447,11 +447,12 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) { + const struct dso *dso = map ? map__dso(map) : NULL; int printed = 0; printed += fprintf(fp, " ("); printed += map__fprintf_dsoname(map, fp); - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) + if (print_off && dso && dso__is_file(dso)) printed += fprintf(fp, "+0x%" PRIx64, addr); printed += fprintf(fp, ")"); ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-20 8:39 ` Adrian Hunter @ 2023-04-21 5:04 ` Changbin Du 2023-04-21 7:30 ` Adrian Hunter 0 siblings, 1 reply; 15+ messages in thread From: Changbin Du @ 2023-04-21 5:04 UTC (permalink / raw) To: Adrian Hunter Cc: Changbin Du, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar > What do you get if you try below diff on top of > your patches: > > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index c7bf1ac14e90..df0d21141185 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -576,8 +576,11 @@ static void set_print_ip_opts(struct perf_event_attr *attr) > if (PRINT_FIELD(DSO)) > output[type].print_ip_opts |= EVSEL__PRINT_DSO; > > - if (PRINT_FIELD(DSOFF)) > + if (PRINT_FIELD(DSOFF)) { > output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; > + /* DSO offset is relative to dso->longname */ > + symbol_conf.show_kernel_path = true; > + } > > if (PRINT_FIELD(SYMOFFSET)) > output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > index a86614599269..19ebfd3468cc 100644 > --- a/tools/perf/util/dso.c > +++ b/tools/perf/util/dso.c > @@ -67,6 +67,42 @@ char dso__symtab_origin(const struct dso *dso) > return origin[dso->symtab_type]; > } > > +bool dso__is_file(const struct dso *dso) > +{ > + switch (dso->binary_type) { > + case DSO_BINARY_TYPE__KALLSYMS: > + case DSO_BINARY_TYPE__GUEST_KALLSYMS: > + return false; > + case DSO_BINARY_TYPE__VMLINUX: > + case DSO_BINARY_TYPE__GUEST_VMLINUX: > + return true; > + case DSO_BINARY_TYPE__JAVA_JIT: > + return false; > + case DSO_BINARY_TYPE__DEBUGLINK: > + case DSO_BINARY_TYPE__BUILD_ID_CACHE: > + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: > + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: > + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: > + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: > + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: > + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: > + case DSO_BINARY_TYPE__GUEST_KMODULE: > + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: > + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: > + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: > + case DSO_BINARY_TYPE__KCORE: > + case DSO_BINARY_TYPE__GUEST_KCORE: > + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: > + return true; > + case DSO_BINARY_TYPE__BPF_PROG_INFO: > + case DSO_BINARY_TYPE__BPF_IMAGE: > + case DSO_BINARY_TYPE__OOL: > + case DSO_BINARY_TYPE__NOT_FOUND: > + default: > + return false; > + } > +} > + > int dso__read_binary_type_filename(const struct dso *dso, > enum dso_binary_type type, > char *root_dir, char *filename, size_t size) > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > index 0b7c7633b9f6..fb33f5224fb6 100644 > --- a/tools/perf/util/dso.h > +++ b/tools/perf/util/dso.h > @@ -396,6 +396,8 @@ static inline bool dso__is_kallsyms(struct dso *dso) > return dso->kernel && dso->long_name[0] != '/'; > } > > +bool dso__is_file(const struct dso *dso); > + > void dso__free_a2l(struct dso *dso); > > enum dso_type dso__type(struct dso *dso, struct machine *machine); > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > index 7da96b41100f..9b79f88d371c 100644 > --- a/tools/perf/util/map.c > +++ b/tools/perf/util/map.c > @@ -447,11 +447,12 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > > size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > { > + const struct dso *dso = map ? map__dso(map) : NULL; > int printed = 0; > > printed += fprintf(fp, " ("); > printed += map__fprintf_dsoname(map, fp); > - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) > + if (print_off && dso && dso__is_file(dso)) > printed += fprintf(fp, "+0x%" PRIx64, addr); > printed += fprintf(fp, ")"); > > Here are the outputs with above change. For elf in build-id cache, it works as expected. $ sudo perf script -F +dsoff perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 native_write_msr+0x6 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee46) perf-exec 12768 135.648032: 8850 cycles: ffffffff96c4c686 native_sched_clock+0x66 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x24c686) ls 27521 501.120978: 4309123 cycles: 7f31cb51c591 _dl_sort_maps+0x301 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) But when I specify my vmlinux: (the binary_type is DSO_BINARY_TYPE__SYSTEM_PATH_DSO) $ sudo perf script -k linux/vmlinux -F +dsoff perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux) perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee46) This is for kcore file: $ sudo perf script --kallsyms /proc/kallsyms -F +dsoff perf-exec 18922 267.284368: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) perf-exec 18922 267.284372: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) perf-exec 18922 267.284374: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) For ko, it's wierd that the binary_type of first one is DSO_BINARY_TYPE__NOT_FOUND. $ sudo perf script -F +dsoff | grep '.ko' gedit 37410 769.927194: 199304 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko) gedit 37410 770.459667: 271035 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) gedit 37410 770.649838: 271878 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) gedit 37410 771.239221: 216084 cycles: ffffffffc0a3d13b ipt_do_table+0xeb (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1db) gedit 37410 771.257816: 219469 cycles: ffffffffc0a3d165 ipt_do_table+0x115 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x205) gedit 37410 771.531158: 288970 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) gedit 37410 771.816916: 321215 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) gedit 37410 773.624786: 332528 cycles: ffffffffc0a3d2ea ipt_do_table+0x29a (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x38a) Maybe we can just filter by name? e.g. '[kernel.kallsyms]', '[guest.kernel.kallsyms]'. -- Cheers, Changbin Du ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-21 5:04 ` Changbin Du @ 2023-04-21 7:30 ` Adrian Hunter 2023-04-23 4:32 ` Changbin Du 0 siblings, 1 reply; 15+ messages in thread From: Adrian Hunter @ 2023-04-21 7:30 UTC (permalink / raw) To: Changbin Du Cc: Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On 21/04/23 08:04, Changbin Du wrote: >> What do you get if you try below diff on top of >> your patches: >> >> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c >> index c7bf1ac14e90..df0d21141185 100644 >> --- a/tools/perf/builtin-script.c >> +++ b/tools/perf/builtin-script.c >> @@ -576,8 +576,11 @@ static void set_print_ip_opts(struct perf_event_attr *attr) >> if (PRINT_FIELD(DSO)) >> output[type].print_ip_opts |= EVSEL__PRINT_DSO; >> >> - if (PRINT_FIELD(DSOFF)) >> + if (PRINT_FIELD(DSOFF)) { >> output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; >> + /* DSO offset is relative to dso->longname */ >> + symbol_conf.show_kernel_path = true; >> + } >> >> if (PRINT_FIELD(SYMOFFSET)) >> output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c >> index a86614599269..19ebfd3468cc 100644 >> --- a/tools/perf/util/dso.c >> +++ b/tools/perf/util/dso.c >> @@ -67,6 +67,42 @@ char dso__symtab_origin(const struct dso *dso) >> return origin[dso->symtab_type]; >> } >> >> +bool dso__is_file(const struct dso *dso) >> +{ >> + switch (dso->binary_type) { >> + case DSO_BINARY_TYPE__KALLSYMS: >> + case DSO_BINARY_TYPE__GUEST_KALLSYMS: >> + return false; >> + case DSO_BINARY_TYPE__VMLINUX: >> + case DSO_BINARY_TYPE__GUEST_VMLINUX: >> + return true; >> + case DSO_BINARY_TYPE__JAVA_JIT: >> + return false; >> + case DSO_BINARY_TYPE__DEBUGLINK: >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE: >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: >> + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: >> + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: >> + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: >> + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: >> + case DSO_BINARY_TYPE__GUEST_KMODULE: >> + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: >> + case DSO_BINARY_TYPE__KCORE: >> + case DSO_BINARY_TYPE__GUEST_KCORE: >> + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: >> + return true; >> + case DSO_BINARY_TYPE__BPF_PROG_INFO: >> + case DSO_BINARY_TYPE__BPF_IMAGE: >> + case DSO_BINARY_TYPE__OOL: >> + case DSO_BINARY_TYPE__NOT_FOUND: >> + default: >> + return false; >> + } >> +} >> + >> int dso__read_binary_type_filename(const struct dso *dso, >> enum dso_binary_type type, >> char *root_dir, char *filename, size_t size) >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h >> index 0b7c7633b9f6..fb33f5224fb6 100644 >> --- a/tools/perf/util/dso.h >> +++ b/tools/perf/util/dso.h >> @@ -396,6 +396,8 @@ static inline bool dso__is_kallsyms(struct dso *dso) >> return dso->kernel && dso->long_name[0] != '/'; >> } >> >> +bool dso__is_file(const struct dso *dso); >> + >> void dso__free_a2l(struct dso *dso); >> >> enum dso_type dso__type(struct dso *dso, struct machine *machine); >> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c >> index 7da96b41100f..9b79f88d371c 100644 >> --- a/tools/perf/util/map.c >> +++ b/tools/perf/util/map.c >> @@ -447,11 +447,12 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) >> >> size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) >> { >> + const struct dso *dso = map ? map__dso(map) : NULL; >> int printed = 0; >> >> printed += fprintf(fp, " ("); >> printed += map__fprintf_dsoname(map, fp); >> - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) >> + if (print_off && dso && dso__is_file(dso)) >> printed += fprintf(fp, "+0x%" PRIx64, addr); >> printed += fprintf(fp, ")"); >> >> > > Here are the outputs with above change. > > For elf in build-id cache, it works as expected. > $ sudo perf script -F +dsoff > perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 native_write_msr+0x6 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee46) > perf-exec 12768 135.648032: 8850 cycles: ffffffff96c4c686 native_sched_clock+0x66 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x24c686) A bit messy though. User can use option --show-kernel-path so let's not force that after all. > ls 27521 501.120978: 4309123 cycles: 7f31cb51c591 _dl_sort_maps+0x301 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) > > But when I specify my vmlinux: (the binary_type is DSO_BINARY_TYPE__SYSTEM_PATH_DSO) > $ sudo perf script -k linux/vmlinux -F +dsoff > perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux) > perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) > perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) > perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee46) > > This is for kcore file: > $ sudo perf script --kallsyms /proc/kallsyms -F +dsoff > perf-exec 18922 267.284368: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > perf-exec 18922 267.284372: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > perf-exec 18922 267.284374: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > > For ko, it's wierd that the binary_type of first one is DSO_BINARY_TYPE__NOT_FOUND. > $ sudo perf script -F +dsoff | grep '.ko' > gedit 37410 769.927194: 199304 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko) > gedit 37410 770.459667: 271035 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) > gedit 37410 770.649838: 271878 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) > gedit 37410 771.239221: 216084 cycles: ffffffffc0a3d13b ipt_do_table+0xeb (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1db) > gedit 37410 771.257816: 219469 cycles: ffffffffc0a3d165 ipt_do_table+0x115 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x205) > gedit 37410 771.531158: 288970 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) > gedit 37410 771.816916: 321215 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) > gedit 37410 773.624786: 332528 cycles: ffffffffc0a3d2ea ipt_do_table+0x29a (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x38a) > > Maybe we can just filter by name? e.g. '[kernel.kallsyms]', '[guest.kernel.kallsyms]'. Using the dso->binary_type deals with other cases also. We can just change case DSO_BINARY_TYPE__NOT_FOUND to return true. How about this: commit abaf1cbf5be5d50b1b3682511b92794394b72178 Author: Adrian Hunter <adrian.hunter@intel.com> Date: Fri Apr 21 10:15:14 2023 +0300 perf script: Refine printing of dso offset Print dso offset only for object files, and in those cases force using the dso->long_name if the dso->name starts with '[' or the dso is kcore, in order to avoid special names such as [vdso], or mixing up kcore with vmlinux. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index a86614599269..046fbfcfdaab 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c @@ -67,6 +67,39 @@ char dso__symtab_origin(const struct dso *dso) return origin[dso->symtab_type]; } +bool dso__is_object_file(const struct dso *dso) +{ + switch (dso->binary_type) { + case DSO_BINARY_TYPE__KALLSYMS: + case DSO_BINARY_TYPE__GUEST_KALLSYMS: + case DSO_BINARY_TYPE__JAVA_JIT: + case DSO_BINARY_TYPE__BPF_PROG_INFO: + case DSO_BINARY_TYPE__BPF_IMAGE: + case DSO_BINARY_TYPE__OOL: + return false; + case DSO_BINARY_TYPE__VMLINUX: + case DSO_BINARY_TYPE__GUEST_VMLINUX: + case DSO_BINARY_TYPE__DEBUGLINK: + case DSO_BINARY_TYPE__BUILD_ID_CACHE: + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: + case DSO_BINARY_TYPE__GUEST_KMODULE: + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: + case DSO_BINARY_TYPE__KCORE: + case DSO_BINARY_TYPE__GUEST_KCORE: + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: + case DSO_BINARY_TYPE__NOT_FOUND: + default: + return true; + } +} + int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type, char *root_dir, char *filename, size_t size) diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h index 0b7c7633b9f6..b23a157c914d 100644 --- a/tools/perf/util/dso.h +++ b/tools/perf/util/dso.h @@ -379,23 +379,25 @@ void dso__reset_find_symbol_cache(struct dso *dso); size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); size_t dso__fprintf(struct dso *dso, FILE *fp); -static inline bool dso__is_vmlinux(struct dso *dso) +static inline bool dso__is_vmlinux(const struct dso *dso) { return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; } -static inline bool dso__is_kcore(struct dso *dso) +static inline bool dso__is_kcore(const struct dso *dso) { return dso->binary_type == DSO_BINARY_TYPE__KCORE || dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; } -static inline bool dso__is_kallsyms(struct dso *dso) +static inline bool dso__is_kallsyms(const struct dso *dso) { return dso->kernel && dso->long_name[0] != '/'; } +bool dso__is_object_file(const struct dso *dso); + void dso__free_a2l(struct dso *dso); enum dso_type dso__type(struct dso *dso, struct machine *machine); diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c index 7da96b41100f..5e7808b0bc87 100644 --- a/tools/perf/util/map.c +++ b/tools/perf/util/map.c @@ -424,14 +424,21 @@ size_t map__fprintf(struct map *map, FILE *fp) map__start(map), map__end(map), map__pgoff(map), dso->name); } -size_t map__fprintf_dsoname(struct map *map, FILE *fp) +static bool prefer_dso_long_name(const struct dso *dso, bool print_off) +{ + return dso->long_name && + (symbol_conf.show_kernel_path || + (print_off && (dso->name[0] == '[' || dso__is_kcore(dso)))); +} + +static size_t __map__fprintf_dsoname(struct map *map, bool print_off, FILE *fp) { char buf[symbol_conf.pad_output_len_dso + 1]; const char *dsoname = "[unknown]"; const struct dso *dso = map ? map__dso(map) : NULL; if (dso) { - if (symbol_conf.show_kernel_path && dso->long_name) + if (prefer_dso_long_name(dso, print_off)) dsoname = dso->long_name; else dsoname = dso->name; @@ -445,13 +452,21 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) return fprintf(fp, "%s", dsoname); } +size_t map__fprintf_dsoname(struct map *map, FILE *fp) +{ + return __map__fprintf_dsoname(map, false, fp); +} + size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) { + const struct dso *dso = map ? map__dso(map) : NULL; int printed = 0; + if (print_off && (!dso || !dso__is_object_file(dso))) + print_off = false; printed += fprintf(fp, " ("); - printed += map__fprintf_dsoname(map, fp); - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) + printed += __map__fprintf_dsoname(map, print_off, fp); + if (print_off) printed += fprintf(fp, "+0x%" PRIx64, addr); printed += fprintf(fp, ")"); ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-21 7:30 ` Adrian Hunter @ 2023-04-23 4:32 ` Changbin Du 2023-04-24 5:25 ` Adrian Hunter 0 siblings, 1 reply; 15+ messages in thread From: Changbin Du @ 2023-04-23 4:32 UTC (permalink / raw) To: Adrian Hunter Cc: Changbin Du, Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On Fri, Apr 21, 2023 at 10:30:45AM +0300, Adrian Hunter wrote: > On 21/04/23 08:04, Changbin Du wrote: > >> What do you get if you try below diff on top of > >> your patches: > >> > >> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > >> index c7bf1ac14e90..df0d21141185 100644 > >> --- a/tools/perf/builtin-script.c > >> +++ b/tools/perf/builtin-script.c > >> @@ -576,8 +576,11 @@ static void set_print_ip_opts(struct perf_event_attr *attr) > >> if (PRINT_FIELD(DSO)) > >> output[type].print_ip_opts |= EVSEL__PRINT_DSO; > >> > >> - if (PRINT_FIELD(DSOFF)) > >> + if (PRINT_FIELD(DSOFF)) { > >> output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; > >> + /* DSO offset is relative to dso->longname */ > >> + symbol_conf.show_kernel_path = true; > >> + } > >> > >> if (PRINT_FIELD(SYMOFFSET)) > >> output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; > >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > >> index a86614599269..19ebfd3468cc 100644 > >> --- a/tools/perf/util/dso.c > >> +++ b/tools/perf/util/dso.c > >> @@ -67,6 +67,42 @@ char dso__symtab_origin(const struct dso *dso) > >> return origin[dso->symtab_type]; > >> } > >> > >> +bool dso__is_file(const struct dso *dso) > >> +{ > >> + switch (dso->binary_type) { > >> + case DSO_BINARY_TYPE__KALLSYMS: > >> + case DSO_BINARY_TYPE__GUEST_KALLSYMS: > >> + return false; > >> + case DSO_BINARY_TYPE__VMLINUX: > >> + case DSO_BINARY_TYPE__GUEST_VMLINUX: > >> + return true; > >> + case DSO_BINARY_TYPE__JAVA_JIT: > >> + return false; > >> + case DSO_BINARY_TYPE__DEBUGLINK: > >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE: > >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: > >> + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: > >> + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: > >> + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: > >> + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: > >> + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: > >> + case DSO_BINARY_TYPE__GUEST_KMODULE: > >> + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: > >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: > >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: > >> + case DSO_BINARY_TYPE__KCORE: > >> + case DSO_BINARY_TYPE__GUEST_KCORE: > >> + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: > >> + return true; > >> + case DSO_BINARY_TYPE__BPF_PROG_INFO: > >> + case DSO_BINARY_TYPE__BPF_IMAGE: > >> + case DSO_BINARY_TYPE__OOL: > >> + case DSO_BINARY_TYPE__NOT_FOUND: > >> + default: > >> + return false; > >> + } > >> +} > >> + > >> int dso__read_binary_type_filename(const struct dso *dso, > >> enum dso_binary_type type, > >> char *root_dir, char *filename, size_t size) > >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > >> index 0b7c7633b9f6..fb33f5224fb6 100644 > >> --- a/tools/perf/util/dso.h > >> +++ b/tools/perf/util/dso.h > >> @@ -396,6 +396,8 @@ static inline bool dso__is_kallsyms(struct dso *dso) > >> return dso->kernel && dso->long_name[0] != '/'; > >> } > >> > >> +bool dso__is_file(const struct dso *dso); > >> + > >> void dso__free_a2l(struct dso *dso); > >> > >> enum dso_type dso__type(struct dso *dso, struct machine *machine); > >> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > >> index 7da96b41100f..9b79f88d371c 100644 > >> --- a/tools/perf/util/map.c > >> +++ b/tools/perf/util/map.c > >> @@ -447,11 +447,12 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > >> > >> size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > >> { > >> + const struct dso *dso = map ? map__dso(map) : NULL; > >> int printed = 0; > >> > >> printed += fprintf(fp, " ("); > >> printed += map__fprintf_dsoname(map, fp); > >> - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) > >> + if (print_off && dso && dso__is_file(dso)) > >> printed += fprintf(fp, "+0x%" PRIx64, addr); > >> printed += fprintf(fp, ")"); > >> > >> > > > > Here are the outputs with above change. > > > > For elf in build-id cache, it works as expected. > > $ sudo perf script -F +dsoff > > perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > > perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > > perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) > > perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 native_write_msr+0x6 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee46) > > perf-exec 12768 135.648032: 8850 cycles: ffffffff96c4c686 native_sched_clock+0x66 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x24c686) > > A bit messy though. User can use option --show-kernel-path > so let's not force that after all. > > > ls 27521 501.120978: 4309123 cycles: 7f31cb51c591 _dl_sort_maps+0x301 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) > > > > But when I specify my vmlinux: (the binary_type is DSO_BINARY_TYPE__SYSTEM_PATH_DSO) > > $ sudo perf script -k linux/vmlinux -F +dsoff > > perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux) > > perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) > > perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) > > perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee46) > > > > This is for kcore file: > > $ sudo perf script --kallsyms /proc/kallsyms -F +dsoff > > perf-exec 18922 267.284368: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > > perf-exec 18922 267.284372: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > > perf-exec 18922 267.284374: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) > > > > For ko, it's wierd that the binary_type of first one is DSO_BINARY_TYPE__NOT_FOUND. > > $ sudo perf script -F +dsoff | grep '.ko' > > gedit 37410 769.927194: 199304 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko) > > gedit 37410 770.459667: 271035 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) > > gedit 37410 770.649838: 271878 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) > > gedit 37410 771.239221: 216084 cycles: ffffffffc0a3d13b ipt_do_table+0xeb (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1db) > > gedit 37410 771.257816: 219469 cycles: ffffffffc0a3d165 ipt_do_table+0x115 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x205) > > gedit 37410 771.531158: 288970 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) > > gedit 37410 771.816916: 321215 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) > > gedit 37410 773.624786: 332528 cycles: ffffffffc0a3d2ea ipt_do_table+0x29a (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x38a) > > > > Maybe we can just filter by name? e.g. '[kernel.kallsyms]', '[guest.kernel.kallsyms]'. > > Using the dso->binary_type deals with other cases also. > We can just change case DSO_BINARY_TYPE__NOT_FOUND to return > true. > > How about this: > > commit abaf1cbf5be5d50b1b3682511b92794394b72178 > Author: Adrian Hunter <adrian.hunter@intel.com> > Date: Fri Apr 21 10:15:14 2023 +0300 > > perf script: Refine printing of dso offset > > Print dso offset only for object files, and in those cases force using the > dso->long_name if the dso->name starts with '[' or the dso is kcore, in > order to avoid special names such as [vdso], or mixing up kcore with > vmlinux. > > Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> > > diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c > index a86614599269..046fbfcfdaab 100644 > --- a/tools/perf/util/dso.c > +++ b/tools/perf/util/dso.c > @@ -67,6 +67,39 @@ char dso__symtab_origin(const struct dso *dso) > return origin[dso->symtab_type]; > } > > +bool dso__is_object_file(const struct dso *dso) > +{ > + switch (dso->binary_type) { > + case DSO_BINARY_TYPE__KALLSYMS: > + case DSO_BINARY_TYPE__GUEST_KALLSYMS: > + case DSO_BINARY_TYPE__JAVA_JIT: > + case DSO_BINARY_TYPE__BPF_PROG_INFO: > + case DSO_BINARY_TYPE__BPF_IMAGE: > + case DSO_BINARY_TYPE__OOL: > + return false; > + case DSO_BINARY_TYPE__VMLINUX: > + case DSO_BINARY_TYPE__GUEST_VMLINUX: > + case DSO_BINARY_TYPE__DEBUGLINK: > + case DSO_BINARY_TYPE__BUILD_ID_CACHE: > + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: > + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: > + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: > + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: > + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: > + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: > + case DSO_BINARY_TYPE__GUEST_KMODULE: > + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: > + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: > + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: > + case DSO_BINARY_TYPE__KCORE: > + case DSO_BINARY_TYPE__GUEST_KCORE: > + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: > + case DSO_BINARY_TYPE__NOT_FOUND: > + default: > + return true; > + } > +} > + > int dso__read_binary_type_filename(const struct dso *dso, > enum dso_binary_type type, > char *root_dir, char *filename, size_t size) > diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h > index 0b7c7633b9f6..b23a157c914d 100644 > --- a/tools/perf/util/dso.h > +++ b/tools/perf/util/dso.h > @@ -379,23 +379,25 @@ void dso__reset_find_symbol_cache(struct dso *dso); > size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); > size_t dso__fprintf(struct dso *dso, FILE *fp); > > -static inline bool dso__is_vmlinux(struct dso *dso) > +static inline bool dso__is_vmlinux(const struct dso *dso) > { > return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || > dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; > } > > -static inline bool dso__is_kcore(struct dso *dso) > +static inline bool dso__is_kcore(const struct dso *dso) > { > return dso->binary_type == DSO_BINARY_TYPE__KCORE || > dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; > } > > -static inline bool dso__is_kallsyms(struct dso *dso) > +static inline bool dso__is_kallsyms(const struct dso *dso) > { > return dso->kernel && dso->long_name[0] != '/'; > } > > +bool dso__is_object_file(const struct dso *dso); > + > void dso__free_a2l(struct dso *dso); > > enum dso_type dso__type(struct dso *dso, struct machine *machine); > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > index 7da96b41100f..5e7808b0bc87 100644 > --- a/tools/perf/util/map.c > +++ b/tools/perf/util/map.c > @@ -424,14 +424,21 @@ size_t map__fprintf(struct map *map, FILE *fp) > map__start(map), map__end(map), map__pgoff(map), dso->name); > } > > -size_t map__fprintf_dsoname(struct map *map, FILE *fp) > +static bool prefer_dso_long_name(const struct dso *dso, bool print_off) > +{ > + return dso->long_name && > + (symbol_conf.show_kernel_path || > + (print_off && (dso->name[0] == '[' || dso__is_kcore(dso)))); > +} > + > +static size_t __map__fprintf_dsoname(struct map *map, bool print_off, FILE *fp) > { > char buf[symbol_conf.pad_output_len_dso + 1]; > const char *dsoname = "[unknown]"; > const struct dso *dso = map ? map__dso(map) : NULL; > > if (dso) { > - if (symbol_conf.show_kernel_path && dso->long_name) > + if (prefer_dso_long_name(dso, print_off)) > dsoname = dso->long_name; > else > dsoname = dso->name; > @@ -445,13 +452,21 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > return fprintf(fp, "%s", dsoname); > } > > +size_t map__fprintf_dsoname(struct map *map, FILE *fp) > +{ > + return __map__fprintf_dsoname(map, false, fp); > +} > + > size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > { > + const struct dso *dso = map ? map__dso(map) : NULL; > int printed = 0; > > + if (print_off && (!dso || !dso__is_object_file(dso))) > + print_off = false; > printed += fprintf(fp, " ("); > - printed += map__fprintf_dsoname(map, fp); > - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) > + printed += __map__fprintf_dsoname(map, print_off, fp); > + if (print_off) > printed += fprintf(fp, "+0x%" PRIx64, addr); > printed += fprintf(fp, ")"); > > > I am fine with this polish patch. So will send this standalone or append to this thread? -- Cheers, Changbin Du ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-23 4:32 ` Changbin Du @ 2023-04-24 5:25 ` Adrian Hunter 0 siblings, 0 replies; 15+ messages in thread From: Adrian Hunter @ 2023-04-24 5:25 UTC (permalink / raw) To: Changbin Du Cc: Arnaldo Carvalho de Melo, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang, Peter Zijlstra, Ingo Molnar On 23/04/23 07:32, Changbin Du wrote: > On Fri, Apr 21, 2023 at 10:30:45AM +0300, Adrian Hunter wrote: >> On 21/04/23 08:04, Changbin Du wrote: >>>> What do you get if you try below diff on top of >>>> your patches: >>>> >>>> diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c >>>> index c7bf1ac14e90..df0d21141185 100644 >>>> --- a/tools/perf/builtin-script.c >>>> +++ b/tools/perf/builtin-script.c >>>> @@ -576,8 +576,11 @@ static void set_print_ip_opts(struct perf_event_attr *attr) >>>> if (PRINT_FIELD(DSO)) >>>> output[type].print_ip_opts |= EVSEL__PRINT_DSO; >>>> >>>> - if (PRINT_FIELD(DSOFF)) >>>> + if (PRINT_FIELD(DSOFF)) { >>>> output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; >>>> + /* DSO offset is relative to dso->longname */ >>>> + symbol_conf.show_kernel_path = true; >>>> + } >>>> >>>> if (PRINT_FIELD(SYMOFFSET)) >>>> output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; >>>> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c >>>> index a86614599269..19ebfd3468cc 100644 >>>> --- a/tools/perf/util/dso.c >>>> +++ b/tools/perf/util/dso.c >>>> @@ -67,6 +67,42 @@ char dso__symtab_origin(const struct dso *dso) >>>> return origin[dso->symtab_type]; >>>> } >>>> >>>> +bool dso__is_file(const struct dso *dso) >>>> +{ >>>> + switch (dso->binary_type) { >>>> + case DSO_BINARY_TYPE__KALLSYMS: >>>> + case DSO_BINARY_TYPE__GUEST_KALLSYMS: >>>> + return false; >>>> + case DSO_BINARY_TYPE__VMLINUX: >>>> + case DSO_BINARY_TYPE__GUEST_VMLINUX: >>>> + return true; >>>> + case DSO_BINARY_TYPE__JAVA_JIT: >>>> + return false; >>>> + case DSO_BINARY_TYPE__DEBUGLINK: >>>> + case DSO_BINARY_TYPE__BUILD_ID_CACHE: >>>> + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: >>>> + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: >>>> + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: >>>> + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: >>>> + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: >>>> + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: >>>> + case DSO_BINARY_TYPE__GUEST_KMODULE: >>>> + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: >>>> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: >>>> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: >>>> + case DSO_BINARY_TYPE__KCORE: >>>> + case DSO_BINARY_TYPE__GUEST_KCORE: >>>> + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: >>>> + return true; >>>> + case DSO_BINARY_TYPE__BPF_PROG_INFO: >>>> + case DSO_BINARY_TYPE__BPF_IMAGE: >>>> + case DSO_BINARY_TYPE__OOL: >>>> + case DSO_BINARY_TYPE__NOT_FOUND: >>>> + default: >>>> + return false; >>>> + } >>>> +} >>>> + >>>> int dso__read_binary_type_filename(const struct dso *dso, >>>> enum dso_binary_type type, >>>> char *root_dir, char *filename, size_t size) >>>> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h >>>> index 0b7c7633b9f6..fb33f5224fb6 100644 >>>> --- a/tools/perf/util/dso.h >>>> +++ b/tools/perf/util/dso.h >>>> @@ -396,6 +396,8 @@ static inline bool dso__is_kallsyms(struct dso *dso) >>>> return dso->kernel && dso->long_name[0] != '/'; >>>> } >>>> >>>> +bool dso__is_file(const struct dso *dso); >>>> + >>>> void dso__free_a2l(struct dso *dso); >>>> >>>> enum dso_type dso__type(struct dso *dso, struct machine *machine); >>>> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c >>>> index 7da96b41100f..9b79f88d371c 100644 >>>> --- a/tools/perf/util/map.c >>>> +++ b/tools/perf/util/map.c >>>> @@ -447,11 +447,12 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) >>>> >>>> size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) >>>> { >>>> + const struct dso *dso = map ? map__dso(map) : NULL; >>>> int printed = 0; >>>> >>>> printed += fprintf(fp, " ("); >>>> printed += map__fprintf_dsoname(map, fp); >>>> - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) >>>> + if (print_off && dso && dso__is_file(dso)) >>>> printed += fprintf(fp, "+0x%" PRIx64, addr); >>>> printed += fprintf(fp, ")"); >>>> >>>> >>> >>> Here are the outputs with above change. >>> >>> For elf in build-id cache, it works as expected. >>> $ sudo perf script -F +dsoff >>> perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) >>> perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) >>> perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee44) >>> perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 native_write_msr+0x6 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x28ee46) >>> perf-exec 12768 135.648032: 8850 cycles: ffffffff96c4c686 native_sched_clock+0x66 (/home/changbin/.debug/.build-id/5e/2fa721660d663f38b6e1aa98d6fa3776974b54/elf+0x24c686) >> >> A bit messy though. User can use option --show-kernel-path >> so let's not force that after all. >> >>> ls 27521 501.120978: 4309123 cycles: 7f31cb51c591 _dl_sort_maps+0x301 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) >>> >>> But when I specify my vmlinux: (the binary_type is DSO_BINARY_TYPE__SYSTEM_PATH_DSO) >>> $ sudo perf script -k linux/vmlinux -F +dsoff >>> perf-exec 12768 135.648023: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux) >>> perf-exec 12768 135.648028: 1 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) >>> perf-exec 12768 135.648030: 11 cycles: ffffffff96c8ee44 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee44) >>> perf-exec 12768 135.648031: 295 cycles: ffffffff96c8ee46 [unknown] (/lib/modules/6.2.12/build/vmlinux+0xffffffff96c8ee46) >>> >>> This is for kcore file: >>> $ sudo perf script --kallsyms /proc/kallsyms -F +dsoff >>> perf-exec 18922 267.284368: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) >>> perf-exec 18922 267.284372: 1 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) >>> perf-exec 18922 267.284374: 11 cycles: ffffffff96c8ee44 native_write_msr+0x4 (/proc/kcore+0x7fff96c91e44) >>> >>> For ko, it's wierd that the binary_type of first one is DSO_BINARY_TYPE__NOT_FOUND. >>> $ sudo perf script -F +dsoff | grep '.ko' >>> gedit 37410 769.927194: 199304 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko) >>> gedit 37410 770.459667: 271035 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) >>> gedit 37410 770.649838: 271878 cycles: ffffffffc0a3d050 ipt_do_table+0x0 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0xf0) >>> gedit 37410 771.239221: 216084 cycles: ffffffffc0a3d13b ipt_do_table+0xeb (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1db) >>> gedit 37410 771.257816: 219469 cycles: ffffffffc0a3d165 ipt_do_table+0x115 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x205) >>> gedit 37410 771.531158: 288970 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) >>> gedit 37410 771.816916: 321215 cycles: ffffffffc0a3d151 ipt_do_table+0x101 (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x1f1) >>> gedit 37410 773.624786: 332528 cycles: ffffffffc0a3d2ea ipt_do_table+0x29a (/lib/modules/6.2.12/kernel/net/ipv4/netfilter/ip_tables.ko+0x38a) >>> >>> Maybe we can just filter by name? e.g. '[kernel.kallsyms]', '[guest.kernel.kallsyms]'. >> >> Using the dso->binary_type deals with other cases also. >> We can just change case DSO_BINARY_TYPE__NOT_FOUND to return >> true. >> >> How about this: >> >> commit abaf1cbf5be5d50b1b3682511b92794394b72178 >> Author: Adrian Hunter <adrian.hunter@intel.com> >> Date: Fri Apr 21 10:15:14 2023 +0300 >> >> perf script: Refine printing of dso offset >> >> Print dso offset only for object files, and in those cases force using the >> dso->long_name if the dso->name starts with '[' or the dso is kcore, in >> order to avoid special names such as [vdso], or mixing up kcore with >> vmlinux. >> >> Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> >> >> diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c >> index a86614599269..046fbfcfdaab 100644 >> --- a/tools/perf/util/dso.c >> +++ b/tools/perf/util/dso.c >> @@ -67,6 +67,39 @@ char dso__symtab_origin(const struct dso *dso) >> return origin[dso->symtab_type]; >> } >> >> +bool dso__is_object_file(const struct dso *dso) >> +{ >> + switch (dso->binary_type) { >> + case DSO_BINARY_TYPE__KALLSYMS: >> + case DSO_BINARY_TYPE__GUEST_KALLSYMS: >> + case DSO_BINARY_TYPE__JAVA_JIT: >> + case DSO_BINARY_TYPE__BPF_PROG_INFO: >> + case DSO_BINARY_TYPE__BPF_IMAGE: >> + case DSO_BINARY_TYPE__OOL: >> + return false; >> + case DSO_BINARY_TYPE__VMLINUX: >> + case DSO_BINARY_TYPE__GUEST_VMLINUX: >> + case DSO_BINARY_TYPE__DEBUGLINK: >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE: >> + case DSO_BINARY_TYPE__BUILD_ID_CACHE_DEBUGINFO: >> + case DSO_BINARY_TYPE__FEDORA_DEBUGINFO: >> + case DSO_BINARY_TYPE__UBUNTU_DEBUGINFO: >> + case DSO_BINARY_TYPE__MIXEDUP_UBUNTU_DEBUGINFO: >> + case DSO_BINARY_TYPE__BUILDID_DEBUGINFO: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_DSO: >> + case DSO_BINARY_TYPE__GUEST_KMODULE: >> + case DSO_BINARY_TYPE__GUEST_KMODULE_COMP: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE: >> + case DSO_BINARY_TYPE__SYSTEM_PATH_KMODULE_COMP: >> + case DSO_BINARY_TYPE__KCORE: >> + case DSO_BINARY_TYPE__GUEST_KCORE: >> + case DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO: >> + case DSO_BINARY_TYPE__NOT_FOUND: >> + default: >> + return true; >> + } >> +} >> + >> int dso__read_binary_type_filename(const struct dso *dso, >> enum dso_binary_type type, >> char *root_dir, char *filename, size_t size) >> diff --git a/tools/perf/util/dso.h b/tools/perf/util/dso.h >> index 0b7c7633b9f6..b23a157c914d 100644 >> --- a/tools/perf/util/dso.h >> +++ b/tools/perf/util/dso.h >> @@ -379,23 +379,25 @@ void dso__reset_find_symbol_cache(struct dso *dso); >> size_t dso__fprintf_symbols_by_name(struct dso *dso, FILE *fp); >> size_t dso__fprintf(struct dso *dso, FILE *fp); >> >> -static inline bool dso__is_vmlinux(struct dso *dso) >> +static inline bool dso__is_vmlinux(const struct dso *dso) >> { >> return dso->binary_type == DSO_BINARY_TYPE__VMLINUX || >> dso->binary_type == DSO_BINARY_TYPE__GUEST_VMLINUX; >> } >> >> -static inline bool dso__is_kcore(struct dso *dso) >> +static inline bool dso__is_kcore(const struct dso *dso) >> { >> return dso->binary_type == DSO_BINARY_TYPE__KCORE || >> dso->binary_type == DSO_BINARY_TYPE__GUEST_KCORE; >> } >> >> -static inline bool dso__is_kallsyms(struct dso *dso) >> +static inline bool dso__is_kallsyms(const struct dso *dso) >> { >> return dso->kernel && dso->long_name[0] != '/'; >> } >> >> +bool dso__is_object_file(const struct dso *dso); >> + >> void dso__free_a2l(struct dso *dso); >> >> enum dso_type dso__type(struct dso *dso, struct machine *machine); >> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c >> index 7da96b41100f..5e7808b0bc87 100644 >> --- a/tools/perf/util/map.c >> +++ b/tools/perf/util/map.c >> @@ -424,14 +424,21 @@ size_t map__fprintf(struct map *map, FILE *fp) >> map__start(map), map__end(map), map__pgoff(map), dso->name); >> } >> >> -size_t map__fprintf_dsoname(struct map *map, FILE *fp) >> +static bool prefer_dso_long_name(const struct dso *dso, bool print_off) >> +{ >> + return dso->long_name && >> + (symbol_conf.show_kernel_path || >> + (print_off && (dso->name[0] == '[' || dso__is_kcore(dso)))); >> +} >> + >> +static size_t __map__fprintf_dsoname(struct map *map, bool print_off, FILE *fp) >> { >> char buf[symbol_conf.pad_output_len_dso + 1]; >> const char *dsoname = "[unknown]"; >> const struct dso *dso = map ? map__dso(map) : NULL; >> >> if (dso) { >> - if (symbol_conf.show_kernel_path && dso->long_name) >> + if (prefer_dso_long_name(dso, print_off)) >> dsoname = dso->long_name; >> else >> dsoname = dso->name; >> @@ -445,13 +452,21 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) >> return fprintf(fp, "%s", dsoname); >> } >> >> +size_t map__fprintf_dsoname(struct map *map, FILE *fp) >> +{ >> + return __map__fprintf_dsoname(map, false, fp); >> +} >> + >> size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) >> { >> + const struct dso *dso = map ? map__dso(map) : NULL; >> int printed = 0; >> >> + if (print_off && (!dso || !dso__is_object_file(dso))) >> + print_off = false; >> printed += fprintf(fp, " ("); >> - printed += map__fprintf_dsoname(map, fp); >> - if (print_off && map && map__dso(map) && !map__dso(map)->kernel) >> + printed += __map__fprintf_dsoname(map, print_off, fp); >> + if (print_off) >> printed += fprintf(fp, "+0x%" PRIx64, addr); >> printed += fprintf(fp, ")"); >> >> >> > I am fine with this polish patch. So will send this standalone or append to this > thread? I will send my patch separately. ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff 2023-04-18 3:18 ` [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff Changbin Du 2023-04-19 18:58 ` Adrian Hunter @ 2023-04-24 5:25 ` Adrian Hunter 1 sibling, 0 replies; 15+ messages in thread From: Adrian Hunter @ 2023-04-24 5:25 UTC (permalink / raw) To: Changbin Du, Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang On 18/04/23 06:18, Changbin Du wrote: > This adds a helper function map__fprintf_dsoname_dsoff() to print dsoname > with optional dso offset. > > Suggested-by: Adrian Hunter <adrian.hunter@intel.com> > Signed-off-by: Changbin Du <changbin.du@huawei.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > tools/perf/util/map.c | 13 +++++++++++++ > tools/perf/util/map.h | 1 + > 2 files changed, 14 insertions(+) > > diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c > index d81b6ca18ee9..7da96b41100f 100644 > --- a/tools/perf/util/map.c > +++ b/tools/perf/util/map.c > @@ -445,6 +445,19 @@ size_t map__fprintf_dsoname(struct map *map, FILE *fp) > return fprintf(fp, "%s", dsoname); > } > > +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp) > +{ > + int printed = 0; > + > + printed += fprintf(fp, " ("); > + printed += map__fprintf_dsoname(map, fp); > + if (print_off && map && map__dso(map) && !map__dso(map)->kernel) > + printed += fprintf(fp, "+0x%" PRIx64, addr); > + printed += fprintf(fp, ")"); > + > + return printed; > +} > + > char *map__srcline(struct map *map, u64 addr, struct symbol *sym) > { > if (map == NULL) > diff --git a/tools/perf/util/map.h b/tools/perf/util/map.h > index f89ab7c2d327..4cca211b6e66 100644 > --- a/tools/perf/util/map.h > +++ b/tools/perf/util/map.h > @@ -175,6 +175,7 @@ static inline void __map__zput(struct map **map) > > size_t map__fprintf(struct map *map, FILE *fp); > size_t map__fprintf_dsoname(struct map *map, FILE *fp); > +size_t map__fprintf_dsoname_dsoff(struct map *map, bool print_off, u64 addr, FILE *fp); > char *map__srcline(struct map *map, u64 addr, struct symbol *sym); > int map__fprintf_srcline(struct map *map, u64 addr, const char *prefix, > FILE *fp); ^ permalink raw reply [flat|nested] 15+ messages in thread
* [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset 2023-04-18 3:18 [PATCH v5 0/3] perf script: Have consistent output for symbol address Changbin Du 2023-04-18 3:18 ` [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain Changbin Du 2023-04-18 3:18 ` [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff Changbin Du @ 2023-04-18 3:18 ` Changbin Du 2023-04-24 5:26 ` Adrian Hunter 2 siblings, 1 reply; 15+ messages in thread From: Changbin Du @ 2023-04-18 3:18 UTC (permalink / raw) To: Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, Adrian Hunter, linux-perf-users, linux-kernel, Hui Wang, Changbin Du This adds a new 'dsoff' field to print dso offset for resolved symbols, and the offset is appended to dso name. Default output: $ perf script ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1) Display 'dsoff' field: $ perf script -F +dsoff ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so+0x1c4b5) ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1+0x68d0) ls 2695501 3011030.487019: 500000 cycles: ffffffff992a6db0 [unknown] ([unknown]) Signed-off-by: Changbin Du <changbin.du@huawei.com> --- tools/perf/Documentation/perf-script.txt | 2 +- tools/perf/builtin-script.c | 60 ++++++++++-------------- tools/perf/util/evsel_fprintf.c | 16 +++---- tools/perf/util/evsel_fprintf.h | 1 + 4 files changed, 32 insertions(+), 47 deletions(-) diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt index 777a0d8ba7d1..ff9a52e44688 100644 --- a/tools/perf/Documentation/perf-script.txt +++ b/tools/perf/Documentation/perf-script.txt @@ -130,7 +130,7 @@ OPTIONS -F:: --fields:: Comma separated list of fields to print. Options are: - comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, + comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff, srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth, phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat, diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c index 8fba247b798c..e7cb8d904eb5 100644 --- a/tools/perf/builtin-script.c +++ b/tools/perf/builtin-script.c @@ -133,6 +133,7 @@ enum perf_output_field { PERF_OUTPUT_VCPU = 1ULL << 38, PERF_OUTPUT_CGROUP = 1ULL << 39, PERF_OUTPUT_RETIRE_LAT = 1ULL << 40, + PERF_OUTPUT_DSOFF = 1ULL << 41, }; struct perf_script { @@ -174,6 +175,7 @@ struct output_option { {.str = "ip", .field = PERF_OUTPUT_IP}, {.str = "sym", .field = PERF_OUTPUT_SYM}, {.str = "dso", .field = PERF_OUTPUT_DSO}, + {.str = "dsoff", .field = PERF_OUTPUT_DSOFF}, {.str = "addr", .field = PERF_OUTPUT_ADDR}, {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET}, {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, @@ -574,6 +576,9 @@ static void set_print_ip_opts(struct perf_event_attr *attr) if (PRINT_FIELD(DSO)) output[type].print_ip_opts |= EVSEL__PRINT_DSO; + if (PRINT_FIELD(DSOFF)) + output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; + if (PRINT_FIELD(SYMOFFSET)) output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; @@ -627,6 +632,10 @@ static int perf_session__check_output_opt(struct perf_session *session) if (evsel == NULL) continue; + /* 'dsoff' implys 'dso' field */ + if (output[j].fields & PERF_OUTPUT_DSOFF) + output[j].fields |= PERF_OUTPUT_DSO; + set_print_ip_opts(&evsel->core.attr); tod |= output[j].fields & PERF_OUTPUT_TOD; } @@ -929,18 +938,12 @@ static int perf_sample__fprintf_brstack(struct perf_sample *sample, } printed += fprintf(fp, " 0x%"PRIx64, from); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alf.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); printed += fprintf(fp, "/0x%"PRIx64, to); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alt.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); printed += print_bstack_flags(fp, entries + i); } @@ -972,18 +975,12 @@ static int perf_sample__fprintf_brstacksym(struct perf_sample *sample, thread__find_symbol_fb(thread, sample->cpumode, to, &alt); printed += symbol__fprintf_symname_offs(alf.sym, &alf, fp); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alf.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); printed += fprintf(fp, "%c", '/'); printed += symbol__fprintf_symname_offs(alt.sym, &alt, fp); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alt.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); printed += print_bstack_flags(fp, entries + i); } @@ -1019,17 +1016,11 @@ static int perf_sample__fprintf_brstackoff(struct perf_sample *sample, to = map__dso_map_ip(alt.map, to); printed += fprintf(fp, " 0x%"PRIx64, from); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alf.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); printed += fprintf(fp, "/0x%"PRIx64, to); - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, "("); - printed += map__fprintf_dsoname(alt.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); printed += print_bstack_flags(fp, entries + i); } @@ -1394,11 +1385,8 @@ static int perf_sample__fprintf_addr(struct perf_sample *sample, printed += symbol__fprintf_symname(al.sym, fp); } - if (PRINT_FIELD(DSO)) { - printed += fprintf(fp, " ("); - printed += map__fprintf_dsoname(al.map, fp); - printed += fprintf(fp, ")"); - } + if (PRINT_FIELD(DSO)) + printed += map__fprintf_dsoname_dsoff(al.map, PRINT_FIELD(DSOFF), al.addr, fp); out: return printed; } @@ -3877,7 +3865,7 @@ int cmd_script(int argc, const char **argv) "comma separated output fields prepend with 'type:'. " "+field to add and -field to remove." "Valid types: hw,sw,trace,raw,synth. " - "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," + "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff" "addr,symoff,srcline,period,iregs,uregs,brstack," "brstacksym,flags,data_src,weight,bpf-output,brstackinsn," "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth," diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c index cc80ec554c0a..79e42d66f55b 100644 --- a/tools/perf/util/evsel_fprintf.c +++ b/tools/perf/util/evsel_fprintf.c @@ -116,6 +116,7 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, int print_ip = print_opts & EVSEL__PRINT_IP; int print_sym = print_opts & EVSEL__PRINT_SYM; int print_dso = print_opts & EVSEL__PRINT_DSO; + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; int print_oneline = print_opts & EVSEL__PRINT_ONELINE; int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; @@ -171,11 +172,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, } } - if (print_dso && (!sym || !sym->inlined)) { - printed += fprintf(fp, " ("); - printed += map__fprintf_dsoname(map, fp); - printed += fprintf(fp, ")"); - } + if (print_dso && (!sym || !sym->inlined)) + printed += map__fprintf_dsoname_dsoff(map, print_dsoff, addr, fp); if (print_srcline) printed += map__fprintf_srcline(map, addr, "\n ", fp); @@ -209,6 +207,7 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, int print_ip = print_opts & EVSEL__PRINT_IP; int print_sym = print_opts & EVSEL__PRINT_SYM; int print_dso = print_opts & EVSEL__PRINT_DSO; + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; @@ -234,11 +233,8 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, } } - if (print_dso) { - printed += fprintf(fp, " ("); - printed += map__fprintf_dsoname(al->map, fp); - printed += fprintf(fp, ")"); - } + if (print_dso) + printed += map__fprintf_dsoname_dsoff(al->map, print_dsoff, al->addr, fp); if (print_srcline) printed += map__fprintf_srcline(al->map, al->addr, "\n ", fp); diff --git a/tools/perf/util/evsel_fprintf.h b/tools/perf/util/evsel_fprintf.h index 3093d096c29f..c8a9fac2f2dd 100644 --- a/tools/perf/util/evsel_fprintf.h +++ b/tools/perf/util/evsel_fprintf.h @@ -26,6 +26,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE #define EVSEL__PRINT_UNKNOWN_AS_ADDR (1<<6) #define EVSEL__PRINT_CALLCHAIN_ARROW (1<<7) #define EVSEL__PRINT_SKIP_IGNORED (1<<8) +#define EVSEL__PRINT_DSOFF (1<<9) struct addr_location; struct perf_event_attr; -- 2.25.1 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset 2023-04-18 3:18 ` [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset Changbin Du @ 2023-04-24 5:26 ` Adrian Hunter 2023-04-29 1:40 ` Arnaldo Carvalho de Melo 0 siblings, 1 reply; 15+ messages in thread From: Adrian Hunter @ 2023-04-24 5:26 UTC (permalink / raw) To: Changbin Du, Arnaldo Carvalho de Melo, Peter Zijlstra, Ingo Molnar Cc: Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang On 18/04/23 06:18, Changbin Du wrote: > This adds a new 'dsoff' field to print dso offset for resolved symbols, > and the offset is appended to dso name. > > Default output: > $ perf script > ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) > ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) > ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) > ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1) > > Display 'dsoff' field: > $ perf script -F +dsoff > ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so+0x1c4b5) > ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) > ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) > ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1+0x68d0) > ls 2695501 3011030.487019: 500000 cycles: ffffffff992a6db0 [unknown] ([unknown]) > > Signed-off-by: Changbin Du <changbin.du@huawei.com> Acked-by: Adrian Hunter <adrian.hunter@intel.com> > --- > tools/perf/Documentation/perf-script.txt | 2 +- > tools/perf/builtin-script.c | 60 ++++++++++-------------- > tools/perf/util/evsel_fprintf.c | 16 +++---- > tools/perf/util/evsel_fprintf.h | 1 + > 4 files changed, 32 insertions(+), 47 deletions(-) > > diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt > index 777a0d8ba7d1..ff9a52e44688 100644 > --- a/tools/perf/Documentation/perf-script.txt > +++ b/tools/perf/Documentation/perf-script.txt > @@ -130,7 +130,7 @@ OPTIONS > -F:: > --fields:: > Comma separated list of fields to print. Options are: > - comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, > + comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff, > srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, > brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth, > phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat, > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > index 8fba247b798c..e7cb8d904eb5 100644 > --- a/tools/perf/builtin-script.c > +++ b/tools/perf/builtin-script.c > @@ -133,6 +133,7 @@ enum perf_output_field { > PERF_OUTPUT_VCPU = 1ULL << 38, > PERF_OUTPUT_CGROUP = 1ULL << 39, > PERF_OUTPUT_RETIRE_LAT = 1ULL << 40, > + PERF_OUTPUT_DSOFF = 1ULL << 41, > }; > > struct perf_script { > @@ -174,6 +175,7 @@ struct output_option { > {.str = "ip", .field = PERF_OUTPUT_IP}, > {.str = "sym", .field = PERF_OUTPUT_SYM}, > {.str = "dso", .field = PERF_OUTPUT_DSO}, > + {.str = "dsoff", .field = PERF_OUTPUT_DSOFF}, > {.str = "addr", .field = PERF_OUTPUT_ADDR}, > {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET}, > {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, > @@ -574,6 +576,9 @@ static void set_print_ip_opts(struct perf_event_attr *attr) > if (PRINT_FIELD(DSO)) > output[type].print_ip_opts |= EVSEL__PRINT_DSO; > > + if (PRINT_FIELD(DSOFF)) > + output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; > + > if (PRINT_FIELD(SYMOFFSET)) > output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; > > @@ -627,6 +632,10 @@ static int perf_session__check_output_opt(struct perf_session *session) > if (evsel == NULL) > continue; > > + /* 'dsoff' implys 'dso' field */ > + if (output[j].fields & PERF_OUTPUT_DSOFF) > + output[j].fields |= PERF_OUTPUT_DSO; > + > set_print_ip_opts(&evsel->core.attr); > tod |= output[j].fields & PERF_OUTPUT_TOD; > } > @@ -929,18 +938,12 @@ static int perf_sample__fprintf_brstack(struct perf_sample *sample, > } > > printed += fprintf(fp, " 0x%"PRIx64, from); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alf.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > > printed += fprintf(fp, "/0x%"PRIx64, to); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alt.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > > printed += print_bstack_flags(fp, entries + i); > } > @@ -972,18 +975,12 @@ static int perf_sample__fprintf_brstacksym(struct perf_sample *sample, > thread__find_symbol_fb(thread, sample->cpumode, to, &alt); > > printed += symbol__fprintf_symname_offs(alf.sym, &alf, fp); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alf.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > printed += fprintf(fp, "%c", '/'); > printed += symbol__fprintf_symname_offs(alt.sym, &alt, fp); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alt.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > printed += print_bstack_flags(fp, entries + i); > } > > @@ -1019,17 +1016,11 @@ static int perf_sample__fprintf_brstackoff(struct perf_sample *sample, > to = map__dso_map_ip(alt.map, to); > > printed += fprintf(fp, " 0x%"PRIx64, from); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alf.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > printed += fprintf(fp, "/0x%"PRIx64, to); > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, "("); > - printed += map__fprintf_dsoname(alt.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > printed += print_bstack_flags(fp, entries + i); > } > > @@ -1394,11 +1385,8 @@ static int perf_sample__fprintf_addr(struct perf_sample *sample, > printed += symbol__fprintf_symname(al.sym, fp); > } > > - if (PRINT_FIELD(DSO)) { > - printed += fprintf(fp, " ("); > - printed += map__fprintf_dsoname(al.map, fp); > - printed += fprintf(fp, ")"); > - } > + if (PRINT_FIELD(DSO)) > + printed += map__fprintf_dsoname_dsoff(al.map, PRINT_FIELD(DSOFF), al.addr, fp); > out: > return printed; > } > @@ -3877,7 +3865,7 @@ int cmd_script(int argc, const char **argv) > "comma separated output fields prepend with 'type:'. " > "+field to add and -field to remove." > "Valid types: hw,sw,trace,raw,synth. " > - "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," > + "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff" > "addr,symoff,srcline,period,iregs,uregs,brstack," > "brstacksym,flags,data_src,weight,bpf-output,brstackinsn," > "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth," > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c > index cc80ec554c0a..79e42d66f55b 100644 > --- a/tools/perf/util/evsel_fprintf.c > +++ b/tools/perf/util/evsel_fprintf.c > @@ -116,6 +116,7 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, > int print_ip = print_opts & EVSEL__PRINT_IP; > int print_sym = print_opts & EVSEL__PRINT_SYM; > int print_dso = print_opts & EVSEL__PRINT_DSO; > + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; > int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; > int print_oneline = print_opts & EVSEL__PRINT_ONELINE; > int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; > @@ -171,11 +172,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, > } > } > > - if (print_dso && (!sym || !sym->inlined)) { > - printed += fprintf(fp, " ("); > - printed += map__fprintf_dsoname(map, fp); > - printed += fprintf(fp, ")"); > - } > + if (print_dso && (!sym || !sym->inlined)) > + printed += map__fprintf_dsoname_dsoff(map, print_dsoff, addr, fp); > > if (print_srcline) > printed += map__fprintf_srcline(map, addr, "\n ", fp); > @@ -209,6 +207,7 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, > int print_ip = print_opts & EVSEL__PRINT_IP; > int print_sym = print_opts & EVSEL__PRINT_SYM; > int print_dso = print_opts & EVSEL__PRINT_DSO; > + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; > int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; > int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; > int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; > @@ -234,11 +233,8 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, > } > } > > - if (print_dso) { > - printed += fprintf(fp, " ("); > - printed += map__fprintf_dsoname(al->map, fp); > - printed += fprintf(fp, ")"); > - } > + if (print_dso) > + printed += map__fprintf_dsoname_dsoff(al->map, print_dsoff, al->addr, fp); > > if (print_srcline) > printed += map__fprintf_srcline(al->map, al->addr, "\n ", fp); > diff --git a/tools/perf/util/evsel_fprintf.h b/tools/perf/util/evsel_fprintf.h > index 3093d096c29f..c8a9fac2f2dd 100644 > --- a/tools/perf/util/evsel_fprintf.h > +++ b/tools/perf/util/evsel_fprintf.h > @@ -26,6 +26,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE > #define EVSEL__PRINT_UNKNOWN_AS_ADDR (1<<6) > #define EVSEL__PRINT_CALLCHAIN_ARROW (1<<7) > #define EVSEL__PRINT_SKIP_IGNORED (1<<8) > +#define EVSEL__PRINT_DSOFF (1<<9) > > struct addr_location; > struct perf_event_attr; ^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset 2023-04-24 5:26 ` Adrian Hunter @ 2023-04-29 1:40 ` Arnaldo Carvalho de Melo 0 siblings, 0 replies; 15+ messages in thread From: Arnaldo Carvalho de Melo @ 2023-04-29 1:40 UTC (permalink / raw) To: Adrian Hunter Cc: Changbin Du, Peter Zijlstra, Ingo Molnar, Mark Rutland, Alexander Shishkin, Jiri Olsa, Namhyung Kim, Ian Rogers, linux-perf-users, linux-kernel, Hui Wang Em Mon, Apr 24, 2023 at 08:26:03AM +0300, Adrian Hunter escreveu: > On 18/04/23 06:18, Changbin Du wrote: > > This adds a new 'dsoff' field to print dso offset for resolved symbols, > > and the offset is appended to dso name. > > > > Default output: > > $ perf script > > ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) > > ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) > > ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1) > > > > Display 'dsoff' field: > > $ perf script -F +dsoff > > ls 2695501 3011030.487017: 500000 cycles: 152cc73ef4b5 get_common_indices.constprop.0+0x155 (/usr/lib/x86_64-linux-gnu/ld-2.31.so+0x1c4b5) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff99045b3e [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968e107 [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffffc1f54afb [unknown] ([unknown]) > > ls 2695501 3011030.487018: 500000 cycles: ffffffff9968382f [unknown] ([unknown]) > > ls 2695501 3011030.487019: 500000 cycles: ffffffff99e00094 [unknown] ([unknown]) > > ls 2695501 3011030.487019: 500000 cycles: 152cc718a8d0 __errno_location@plt+0x0 (/usr/lib/x86_64-linux-gnu/libselinux.so.1+0x68d0) > > ls 2695501 3011030.487019: 500000 cycles: ffffffff992a6db0 [unknown] ([unknown]) > > > > Signed-off-by: Changbin Du <changbin.du@huawei.com> > > Acked-by: Adrian Hunter <adrian.hunter@intel.com> Thanks, applied the series. - Arnaldo > > --- > > tools/perf/Documentation/perf-script.txt | 2 +- > > tools/perf/builtin-script.c | 60 ++++++++++-------------- > > tools/perf/util/evsel_fprintf.c | 16 +++---- > > tools/perf/util/evsel_fprintf.h | 1 + > > 4 files changed, 32 insertions(+), 47 deletions(-) > > > > diff --git a/tools/perf/Documentation/perf-script.txt b/tools/perf/Documentation/perf-script.txt > > index 777a0d8ba7d1..ff9a52e44688 100644 > > --- a/tools/perf/Documentation/perf-script.txt > > +++ b/tools/perf/Documentation/perf-script.txt > > @@ -130,7 +130,7 @@ OPTIONS > > -F:: > > --fields:: > > Comma separated list of fields to print. Options are: > > - comm, tid, pid, time, cpu, event, trace, ip, sym, dso, addr, symoff, > > + comm, tid, pid, time, cpu, event, trace, ip, sym, dso, dsoff, addr, symoff, > > srcline, period, iregs, uregs, brstack, brstacksym, flags, bpf-output, > > brstackinsn, brstackinsnlen, brstackoff, callindent, insn, insnlen, synth, > > phys_addr, metric, misc, srccode, ipc, data_page_size, code_page_size, ins_lat, > > diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c > > index 8fba247b798c..e7cb8d904eb5 100644 > > --- a/tools/perf/builtin-script.c > > +++ b/tools/perf/builtin-script.c > > @@ -133,6 +133,7 @@ enum perf_output_field { > > PERF_OUTPUT_VCPU = 1ULL << 38, > > PERF_OUTPUT_CGROUP = 1ULL << 39, > > PERF_OUTPUT_RETIRE_LAT = 1ULL << 40, > > + PERF_OUTPUT_DSOFF = 1ULL << 41, > > }; > > > > struct perf_script { > > @@ -174,6 +175,7 @@ struct output_option { > > {.str = "ip", .field = PERF_OUTPUT_IP}, > > {.str = "sym", .field = PERF_OUTPUT_SYM}, > > {.str = "dso", .field = PERF_OUTPUT_DSO}, > > + {.str = "dsoff", .field = PERF_OUTPUT_DSOFF}, > > {.str = "addr", .field = PERF_OUTPUT_ADDR}, > > {.str = "symoff", .field = PERF_OUTPUT_SYMOFFSET}, > > {.str = "srcline", .field = PERF_OUTPUT_SRCLINE}, > > @@ -574,6 +576,9 @@ static void set_print_ip_opts(struct perf_event_attr *attr) > > if (PRINT_FIELD(DSO)) > > output[type].print_ip_opts |= EVSEL__PRINT_DSO; > > > > + if (PRINT_FIELD(DSOFF)) > > + output[type].print_ip_opts |= EVSEL__PRINT_DSOFF; > > + > > if (PRINT_FIELD(SYMOFFSET)) > > output[type].print_ip_opts |= EVSEL__PRINT_SYMOFFSET; > > > > @@ -627,6 +632,10 @@ static int perf_session__check_output_opt(struct perf_session *session) > > if (evsel == NULL) > > continue; > > > > + /* 'dsoff' implys 'dso' field */ > > + if (output[j].fields & PERF_OUTPUT_DSOFF) > > + output[j].fields |= PERF_OUTPUT_DSO; > > + > > set_print_ip_opts(&evsel->core.attr); > > tod |= output[j].fields & PERF_OUTPUT_TOD; > > } > > @@ -929,18 +938,12 @@ static int perf_sample__fprintf_brstack(struct perf_sample *sample, > > } > > > > printed += fprintf(fp, " 0x%"PRIx64, from); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alf.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > > > > printed += fprintf(fp, "/0x%"PRIx64, to); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alt.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > > > > printed += print_bstack_flags(fp, entries + i); > > } > > @@ -972,18 +975,12 @@ static int perf_sample__fprintf_brstacksym(struct perf_sample *sample, > > thread__find_symbol_fb(thread, sample->cpumode, to, &alt); > > > > printed += symbol__fprintf_symname_offs(alf.sym, &alf, fp); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alf.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > > printed += fprintf(fp, "%c", '/'); > > printed += symbol__fprintf_symname_offs(alt.sym, &alt, fp); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alt.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > > printed += print_bstack_flags(fp, entries + i); > > } > > > > @@ -1019,17 +1016,11 @@ static int perf_sample__fprintf_brstackoff(struct perf_sample *sample, > > to = map__dso_map_ip(alt.map, to); > > > > printed += fprintf(fp, " 0x%"PRIx64, from); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alf.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alf.map, PRINT_FIELD(DSOFF), alf.addr, fp); > > printed += fprintf(fp, "/0x%"PRIx64, to); > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, "("); > > - printed += map__fprintf_dsoname(alt.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(alt.map, PRINT_FIELD(DSOFF), alt.addr, fp); > > printed += print_bstack_flags(fp, entries + i); > > } > > > > @@ -1394,11 +1385,8 @@ static int perf_sample__fprintf_addr(struct perf_sample *sample, > > printed += symbol__fprintf_symname(al.sym, fp); > > } > > > > - if (PRINT_FIELD(DSO)) { > > - printed += fprintf(fp, " ("); > > - printed += map__fprintf_dsoname(al.map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (PRINT_FIELD(DSO)) > > + printed += map__fprintf_dsoname_dsoff(al.map, PRINT_FIELD(DSOFF), al.addr, fp); > > out: > > return printed; > > } > > @@ -3877,7 +3865,7 @@ int cmd_script(int argc, const char **argv) > > "comma separated output fields prepend with 'type:'. " > > "+field to add and -field to remove." > > "Valid types: hw,sw,trace,raw,synth. " > > - "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso," > > + "Fields: comm,tid,pid,time,cpu,event,trace,ip,sym,dso,dsoff" > > "addr,symoff,srcline,period,iregs,uregs,brstack," > > "brstacksym,flags,data_src,weight,bpf-output,brstackinsn," > > "brstackinsnlen,brstackoff,callindent,insn,insnlen,synth," > > diff --git a/tools/perf/util/evsel_fprintf.c b/tools/perf/util/evsel_fprintf.c > > index cc80ec554c0a..79e42d66f55b 100644 > > --- a/tools/perf/util/evsel_fprintf.c > > +++ b/tools/perf/util/evsel_fprintf.c > > @@ -116,6 +116,7 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, > > int print_ip = print_opts & EVSEL__PRINT_IP; > > int print_sym = print_opts & EVSEL__PRINT_SYM; > > int print_dso = print_opts & EVSEL__PRINT_DSO; > > + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; > > int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; > > int print_oneline = print_opts & EVSEL__PRINT_ONELINE; > > int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; > > @@ -171,11 +172,8 @@ int sample__fprintf_callchain(struct perf_sample *sample, int left_alignment, > > } > > } > > > > - if (print_dso && (!sym || !sym->inlined)) { > > - printed += fprintf(fp, " ("); > > - printed += map__fprintf_dsoname(map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (print_dso && (!sym || !sym->inlined)) > > + printed += map__fprintf_dsoname_dsoff(map, print_dsoff, addr, fp); > > > > if (print_srcline) > > printed += map__fprintf_srcline(map, addr, "\n ", fp); > > @@ -209,6 +207,7 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, > > int print_ip = print_opts & EVSEL__PRINT_IP; > > int print_sym = print_opts & EVSEL__PRINT_SYM; > > int print_dso = print_opts & EVSEL__PRINT_DSO; > > + int print_dsoff = print_opts & EVSEL__PRINT_DSOFF; > > int print_symoffset = print_opts & EVSEL__PRINT_SYMOFFSET; > > int print_srcline = print_opts & EVSEL__PRINT_SRCLINE; > > int print_unknown_as_addr = print_opts & EVSEL__PRINT_UNKNOWN_AS_ADDR; > > @@ -234,11 +233,8 @@ int sample__fprintf_sym(struct perf_sample *sample, struct addr_location *al, > > } > > } > > > > - if (print_dso) { > > - printed += fprintf(fp, " ("); > > - printed += map__fprintf_dsoname(al->map, fp); > > - printed += fprintf(fp, ")"); > > - } > > + if (print_dso) > > + printed += map__fprintf_dsoname_dsoff(al->map, print_dsoff, al->addr, fp); > > > > if (print_srcline) > > printed += map__fprintf_srcline(al->map, al->addr, "\n ", fp); > > diff --git a/tools/perf/util/evsel_fprintf.h b/tools/perf/util/evsel_fprintf.h > > index 3093d096c29f..c8a9fac2f2dd 100644 > > --- a/tools/perf/util/evsel_fprintf.h > > +++ b/tools/perf/util/evsel_fprintf.h > > @@ -26,6 +26,7 @@ int evsel__fprintf(struct evsel *evsel, struct perf_attr_details *details, FILE > > #define EVSEL__PRINT_UNKNOWN_AS_ADDR (1<<6) > > #define EVSEL__PRINT_CALLCHAIN_ARROW (1<<7) > > #define EVSEL__PRINT_SKIP_IGNORED (1<<8) > > +#define EVSEL__PRINT_DSOFF (1<<9) > > > > struct addr_location; > > struct perf_event_attr; > -- - Arnaldo ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-04-29 1:40 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-04-18 3:18 [PATCH v5 0/3] perf script: Have consistent output for symbol address Changbin Du 2023-04-18 3:18 ` [PATCH v5 1/3] perf script: print raw ip instead of binary offset for callchain Changbin Du 2023-04-24 5:24 ` Adrian Hunter 2023-04-18 3:18 ` [PATCH v5 2/3] perf: add helper map__fprintf_dsoname_dsoff Changbin Du 2023-04-19 18:58 ` Adrian Hunter 2023-04-20 2:55 ` Changbin Du 2023-04-20 8:39 ` Adrian Hunter 2023-04-21 5:04 ` Changbin Du 2023-04-21 7:30 ` Adrian Hunter 2023-04-23 4:32 ` Changbin Du 2023-04-24 5:25 ` Adrian Hunter 2023-04-24 5:25 ` Adrian Hunter 2023-04-18 3:18 ` [PATCH v5 3/3] perf: script: add new output field 'dsoff' to print dso offset Changbin Du 2023-04-24 5:26 ` Adrian Hunter 2023-04-29 1:40 ` Arnaldo Carvalho de Melo
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.