* [PATCH v4 0/2] perf report: Support annotation of code without symbols
@ 2020-02-25 5:14 Jin Yao
2020-02-25 5:14 ` [PATCH v4 1/2] perf util: Print al_addr when symbol is not found Jin Yao
2020-02-25 5:14 ` [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols Jin Yao
0 siblings, 2 replies; 5+ messages in thread
From: Jin Yao @ 2020-02-25 5:14 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
For perf report on stripped binaries it is currently impossible to do
annotation. The annotation state is all tied to symbols, but there are
either no symbols, or symbols are not covering all the code.
We should support the annotation functionality even without symbols.
The first patch uses al_addr to print because it's easy to dump
the instructions from this address in binary for branch mode.
The second patch supports the annotation on stripped binary.
v4:
---
1. Support the hotkey 'a'. When we press 'a' on address,
now it supports the annotation.
2. Change the patch title from
"Support interactive annotation of code without symbols" to
"perf report: Support interactive annotation of code without symbols"
v3:
---
Keep just the ANNOTATION_DUMMY_LEN, and remove the
opts->annotate_dummy_len since it's the "maybe in future
we will provide" feature.
v2:
---
Fix a crash issue when annotating an address in "unknown" object.
Jin Yao (2):
perf util: Print al_addr when symbol is not found
perf report: Support interactive annotation of code without symbols
tools/perf/ui/browsers/hists.c | 83 ++++++++++++++++++++++++++--------
tools/perf/util/annotate.h | 1 +
tools/perf/util/sort.c | 6 ++-
3 files changed, 70 insertions(+), 20 deletions(-)
--
2.17.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v4 1/2] perf util: Print al_addr when symbol is not found
2020-02-25 5:14 [PATCH v4 0/2] perf report: Support annotation of code without symbols Jin Yao
@ 2020-02-25 5:14 ` Jin Yao
2020-02-25 5:14 ` [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols Jin Yao
1 sibling, 0 replies; 5+ messages in thread
From: Jin Yao @ 2020-02-25 5:14 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
For branch mode, if the symbol is not found, it prints
the address.
For example, 0x0000555eee0365a0 in below output.
Overhead Command Source Shared Object Source Symbol Target Symbol
17.55% div libc-2.27.so [.] __random [.] __random
6.11% div div [.] 0x0000555eee0365a0 [.] rand
6.10% div libc-2.27.so [.] rand [.] 0x0000555eee036769
5.80% div libc-2.27.so [.] __random_r [.] __random
5.72% div libc-2.27.so [.] __random [.] __random_r
5.62% div libc-2.27.so [.] __random_r [.] __random_r
5.38% div libc-2.27.so [.] __random [.] rand
4.56% div libc-2.27.so [.] __random [.] __random
4.49% div div [.] 0x0000555eee036779 [.] 0x0000555eee0365ff
4.25% div div [.] 0x0000555eee0365fa [.] 0x0000555eee036760
But it's not very easy to understand what the instructions
are in the binary. So this patch uses the al_addr instead.
With this patch, the output is
Overhead Command Source Shared Object Source Symbol Target Symbol
17.55% div libc-2.27.so [.] __random [.] __random
6.11% div div [.] 0x00000000000005a0 [.] rand
6.10% div libc-2.27.so [.] rand [.] 0x0000000000000769
5.80% div libc-2.27.so [.] __random_r [.] __random
5.72% div libc-2.27.so [.] __random [.] __random_r
5.62% div libc-2.27.so [.] __random_r [.] __random_r
5.38% div libc-2.27.so [.] __random [.] rand
4.56% div libc-2.27.so [.] __random [.] __random
4.49% div div [.] 0x0000000000000779 [.] 0x00000000000005ff
4.25% div div [.] 0x00000000000005fa [.] 0x0000000000000760
Now we can use objdump to dump the object starting from 0x5a0.
For example,
objdump -d --start-address 0x5a0 div
00000000000005a0 <rand@plt>:
5a0: ff 25 2a 0a 20 00 jmpq *0x200a2a(%rip) # 200fd0 <__cxa_finalize@plt+0x200a20>
5a6: 68 02 00 00 00 pushq $0x2
5ab: e9 c0 ff ff ff jmpq 570 <srand@plt-0x10>
...
v2:
---
No change
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/util/sort.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index ab0cfd790ad0..e860595576c2 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -869,7 +869,8 @@ static int hist_entry__sym_from_snprintf(struct hist_entry *he, char *bf,
if (he->branch_info) {
struct addr_map_symbol *from = &he->branch_info->from;
- return _hist_entry__sym_snprintf(&from->ms, from->addr, he->level, bf, size, width);
+ return _hist_entry__sym_snprintf(&from->ms, from->al_addr,
+ he->level, bf, size, width);
}
return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A");
@@ -881,7 +882,8 @@ static int hist_entry__sym_to_snprintf(struct hist_entry *he, char *bf,
if (he->branch_info) {
struct addr_map_symbol *to = &he->branch_info->to;
- return _hist_entry__sym_snprintf(&to->ms, to->addr, he->level, bf, size, width);
+ return _hist_entry__sym_snprintf(&to->ms, to->al_addr,
+ he->level, bf, size, width);
}
return repsep_snprintf(bf, size, "%-*.*s", width, width, "N/A");
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols
2020-02-25 5:14 [PATCH v4 0/2] perf report: Support annotation of code without symbols Jin Yao
2020-02-25 5:14 ` [PATCH v4 1/2] perf util: Print al_addr when symbol is not found Jin Yao
@ 2020-02-25 5:14 ` Jin Yao
2020-02-26 15:38 ` Jiri Olsa
1 sibling, 1 reply; 5+ messages in thread
From: Jin Yao @ 2020-02-25 5:14 UTC (permalink / raw)
To: acme, jolsa, peterz, mingo, alexander.shishkin
Cc: Linux-kernel, ak, kan.liang, yao.jin, Jin Yao
For perf report on stripped binaries it is currently impossible to do
annotation. The annotation state is all tied to symbols, but there are
either no symbols, or symbols are not covering all the code.
We should support the annotation functionality even without symbols.
This patch fakes a dummy symbol and the symbol name is the string of
address. After that, we just follow current annotation working flow.
For example,
1. perf report
Overhead Command Shared Object Symbol
20.67% div libc-2.27.so [.] __random_r
17.29% div libc-2.27.so [.] __random
10.59% div div [.] 0x0000000000000628
9.25% div div [.] 0x0000000000000612
6.11% div div [.] 0x0000000000000645
2. Select the line of "10.59% div div [.] 0x0000000000000628" and ENTER.
Annotate 0x0000000000000628
Zoom into div thread
Zoom into div DSO (use the 'k' hotkey to zoom directly into the kernel)
Browse map details
Run scripts for samples of symbol [0x0000000000000628]
Run scripts for all samples
Switch to another data file in PWD
Exit
3. Select the "Annotate 0x0000000000000628" and ENTER.
Percent│
│
│
│ Disassembly of section .text:
│
│ 0000000000000628 <.text+0x68>:
│ divsd %xmm4,%xmm0
│ divsd %xmm3,%xmm1
│ movsd (%rsp),%xmm2
│ addsd %xmm1,%xmm0
│ addsd %xmm2,%xmm0
│ movsd %xmm0,(%rsp)
Now we can see the dump of object starting from 0x628.
We can also press hotkey 'a' on address in report view.
For branch mode, we only support the annotation for
"branch to" address.
v4:
---
1. Support the hotkey 'a'. When we press 'a' on address,
now it supports the annotation.
2. Change the patch title from
"Support interactive annotation of code without symbols" to
"perf report: Support interactive annotation of code without symbols"
v3:
---
Keep just the ANNOTATION_DUMMY_LEN, and remove the
opts->annotate_dummy_len since it's the "maybe in future
we will provide" feature.
v2:
---
Fix a crash issue when annotating an address in "unknown" object.
The steps to reproduce this issue:
perf record -e cycles:u ls
perf report
75.29% ls ld-2.27.so [.] do_lookup_x
23.64% ls ld-2.27.so [.] __GI___tunables_init
1.04% ls [unknown] [k] 0xffffffff85c01210
0.03% ls ld-2.27.so [.] _start
When annotating 0xffffffff85c01210, the crash happens.
v2 adds checking for ms->map in add_annotate_opt(). If the object is
"unknown", ms->map is NULL.
Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
---
tools/perf/ui/browsers/hists.c | 83 ++++++++++++++++++++++++++--------
tools/perf/util/annotate.h | 1 +
2 files changed, 66 insertions(+), 18 deletions(-)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index f36dee499320..f47d31fca0ed 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -2465,13 +2465,41 @@ do_annotate(struct hist_browser *browser, struct popup_action *act)
return 0;
}
+static struct symbol *new_annotate_sym(u64 addr, struct map *map)
+{
+ struct symbol *sym;
+ struct annotated_source *src;
+ char name[64];
+
+ if (!map || !map->dso || map->dso->annotate_warned)
+ return NULL;
+
+ snprintf(name, sizeof(name), "%-#.*lx", BITS_PER_LONG / 4, addr);
+
+ sym = symbol__new(addr, ANNOTATION_DUMMY_LEN, 0, 0, name);
+ if (sym) {
+ src = symbol__hists(sym, 1);
+ if (!src) {
+ symbol__delete(sym);
+ return NULL;
+ }
+
+ dso__insert_symbol(map->dso, sym);
+ }
+
+ return sym;
+}
+
static int
add_annotate_opt(struct hist_browser *browser __maybe_unused,
struct popup_action *act, char **optstr,
- struct map_symbol *ms)
+ struct map_symbol *ms,
+ u64 addr)
{
- if (ms->sym == NULL || ms->map->dso->annotate_warned ||
- symbol__annotation(ms->sym)->src == NULL)
+ if (!ms->sym)
+ ms->sym = new_annotate_sym(addr, ms->map);
+
+ if (!ms->sym || symbol__annotation(ms->sym)->src == NULL)
return 0;
if (asprintf(optstr, "Annotate %s", ms->sym->name) < 0)
@@ -3026,6 +3054,14 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events,
*/
goto out_free_stack;
case 'a':
+ if (!browser->selection ||
+ !browser->he_selection ||
+ !browser->selection->map ||
+ !browser->selection->map->dso ||
+ browser->selection->map->dso->annotate_warned) {
+ continue;
+ }
+
if (!hists__has(hists, sym)) {
ui_browser__warning(&browser->b, delay_secs * 2,
"Annotation is only available for symbolic views, "
@@ -3033,21 +3069,29 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events,
continue;
}
- if (browser->selection == NULL ||
- browser->selection->sym == NULL ||
- browser->selection->map->dso->annotate_warned)
- continue;
+ if (!browser->selection->sym) {
+ if (sort__mode == SORT_MODE__BRANCH) {
+ bi = browser->he_selection->branch_info;
+ if (!bi)
+ continue;
- if (symbol__annotation(browser->selection->sym)->src == NULL) {
- ui_browser__warning(&browser->b, delay_secs * 2,
- "No samples for the \"%s\" symbol.\n\n"
- "Probably appeared just in a callchain",
- browser->selection->sym->name);
- continue;
+ /* Only annotate bi->to */
+ actions->ms.sym = new_annotate_sym(bi->to.al_addr,
+ bi->to.ms.map);
+ actions->ms.map = bi->to.ms.map;
+ } else {
+ actions->ms.sym = new_annotate_sym(browser->he_selection->ip,
+ browser->selection->map);
+ actions->ms.map = browser->selection->map;
+ }
+
+ if (!actions->ms.sym)
+ continue;
+ } else {
+ actions->ms.sym = browser->selection->sym;
+ actions->ms.map = browser->selection->map;
}
- actions->ms.map = browser->selection->map;
- actions->ms.sym = browser->selection->sym;
do_annotate(browser, actions);
continue;
case 'P':
@@ -3219,17 +3263,20 @@ static int perf_evsel__hists_browse(struct evsel *evsel, int nr_events,
nr_options += add_annotate_opt(browser,
&actions[nr_options],
&options[nr_options],
- &bi->from.ms);
+ &bi->from.ms,
+ bi->from.al_addr);
if (bi->to.ms.sym != bi->from.ms.sym)
nr_options += add_annotate_opt(browser,
&actions[nr_options],
&options[nr_options],
- &bi->to.ms);
+ &bi->to.ms,
+ bi->to.al_addr);
} else {
nr_options += add_annotate_opt(browser,
&actions[nr_options],
&options[nr_options],
- browser->selection);
+ browser->selection,
+ browser->he_selection->ip);
}
skip_annotation:
nr_options += add_thread_opt(browser, &actions[nr_options],
diff --git a/tools/perf/util/annotate.h b/tools/perf/util/annotate.h
index 455403e8fede..c8463c48adf2 100644
--- a/tools/perf/util/annotate.h
+++ b/tools/perf/util/annotate.h
@@ -74,6 +74,7 @@ bool ins__is_fused(struct arch *arch, const char *ins1, const char *ins2);
#define ANNOTATION__CYCLES_WIDTH 6
#define ANNOTATION__MINMAX_CYCLES_WIDTH 19
#define ANNOTATION__AVG_IPC_WIDTH 36
+#define ANNOTATION_DUMMY_LEN 256
struct annotation_options {
bool hide_src_code,
--
2.17.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols
2020-02-25 5:14 ` [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols Jin Yao
@ 2020-02-26 15:38 ` Jiri Olsa
2020-02-27 0:05 ` Jin, Yao
0 siblings, 1 reply; 5+ messages in thread
From: Jiri Olsa @ 2020-02-26 15:38 UTC (permalink / raw)
To: Jin Yao
Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
kan.liang, yao.jin
On Tue, Feb 25, 2020 at 01:14:38PM +0800, Jin Yao wrote:
> For perf report on stripped binaries it is currently impossible to do
> annotation. The annotation state is all tied to symbols, but there are
> either no symbols, or symbols are not covering all the code.
>
> We should support the annotation functionality even without symbols.
>
> This patch fakes a dummy symbol and the symbol name is the string of
> address. After that, we just follow current annotation working flow.
>
> For example,
>
> 1. perf report
>
> Overhead Command Shared Object Symbol
> 20.67% div libc-2.27.so [.] __random_r
> 17.29% div libc-2.27.so [.] __random
> 10.59% div div [.] 0x0000000000000628
> 9.25% div div [.] 0x0000000000000612
> 6.11% div div [.] 0x0000000000000645
>
> 2. Select the line of "10.59% div div [.] 0x0000000000000628" and ENTER.
>
> Annotate 0x0000000000000628
> Zoom into div thread
> Zoom into div DSO (use the 'k' hotkey to zoom directly into the kernel)
> Browse map details
> Run scripts for samples of symbol [0x0000000000000628]
> Run scripts for all samples
> Switch to another data file in PWD
> Exit
>
> 3. Select the "Annotate 0x0000000000000628" and ENTER.
>
> Percent│
> │
> │
> │ Disassembly of section .text:
> │
> │ 0000000000000628 <.text+0x68>:
> │ divsd %xmm4,%xmm0
> │ divsd %xmm3,%xmm1
> │ movsd (%rsp),%xmm2
> │ addsd %xmm1,%xmm0
> │ addsd %xmm2,%xmm0
> │ movsd %xmm0,(%rsp)
>
> Now we can see the dump of object starting from 0x628.
>
> We can also press hotkey 'a' on address in report view.
> For branch mode, we only support the annotation for
> "branch to" address.
>
> v4:
> ---
> 1. Support the hotkey 'a'. When we press 'a' on address,
> now it supports the annotation.
please move this to separate patch, AFAICS it's separate change
and was broken before your change
thanks,
jirka
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols
2020-02-26 15:38 ` Jiri Olsa
@ 2020-02-27 0:05 ` Jin, Yao
0 siblings, 0 replies; 5+ messages in thread
From: Jin, Yao @ 2020-02-27 0:05 UTC (permalink / raw)
To: Jiri Olsa
Cc: acme, jolsa, peterz, mingo, alexander.shishkin, Linux-kernel, ak,
kan.liang, yao.jin
On 2/26/2020 11:38 PM, Jiri Olsa wrote:
> On Tue, Feb 25, 2020 at 01:14:38PM +0800, Jin Yao wrote:
>> For perf report on stripped binaries it is currently impossible to do
>> annotation. The annotation state is all tied to symbols, but there are
>> either no symbols, or symbols are not covering all the code.
>>
>> We should support the annotation functionality even without symbols.
>>
>> This patch fakes a dummy symbol and the symbol name is the string of
>> address. After that, we just follow current annotation working flow.
>>
>> For example,
>>
>> 1. perf report
>>
>> Overhead Command Shared Object Symbol
>> 20.67% div libc-2.27.so [.] __random_r
>> 17.29% div libc-2.27.so [.] __random
>> 10.59% div div [.] 0x0000000000000628
>> 9.25% div div [.] 0x0000000000000612
>> 6.11% div div [.] 0x0000000000000645
>>
>> 2. Select the line of "10.59% div div [.] 0x0000000000000628" and ENTER.
>>
>> Annotate 0x0000000000000628
>> Zoom into div thread
>> Zoom into div DSO (use the 'k' hotkey to zoom directly into the kernel)
>> Browse map details
>> Run scripts for samples of symbol [0x0000000000000628]
>> Run scripts for all samples
>> Switch to another data file in PWD
>> Exit
>>
>> 3. Select the "Annotate 0x0000000000000628" and ENTER.
>>
>> Percent│
>> │
>> │
>> │ Disassembly of section .text:
>> │
>> │ 0000000000000628 <.text+0x68>:
>> │ divsd %xmm4,%xmm0
>> │ divsd %xmm3,%xmm1
>> │ movsd (%rsp),%xmm2
>> │ addsd %xmm1,%xmm0
>> │ addsd %xmm2,%xmm0
>> │ movsd %xmm0,(%rsp)
>>
>> Now we can see the dump of object starting from 0x628.
>>
>> We can also press hotkey 'a' on address in report view.
>> For branch mode, we only support the annotation for
>> "branch to" address.
>>
>> v4:
>> ---
>> 1. Support the hotkey 'a'. When we press 'a' on address,
>> now it supports the annotation.
>
> please move this to separate patch, AFAICS it's separate change
> and was broken before your change
>
> thanks,
> jirka
>
OK, I will move it to a separate patch.
Thanks
Jin Yao
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-02-27 0:05 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-25 5:14 [PATCH v4 0/2] perf report: Support annotation of code without symbols Jin Yao
2020-02-25 5:14 ` [PATCH v4 1/2] perf util: Print al_addr when symbol is not found Jin Yao
2020-02-25 5:14 ` [PATCH v4 2/2] perf report: Support interactive annotation of code without symbols Jin Yao
2020-02-26 15:38 ` Jiri Olsa
2020-02-27 0:05 ` Jin, Yao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).