2020-07-09 08:09:36

by Masami Hiramatsu

[permalink] [raw]
Subject: [PATCH 0/4] perf-probe: Fix GNU IFUNC probe issue etc.

Hi,

Here are patches to fix some issues of probing on GNU IFUNC, duplicated
symbols, and memory leak, which were reported by Andi.

Andi reported that some issues on probing memcpy function in glibc,
which was related to GNU IFUNC (indirect function). As I described
in the patch [4/4], it is hard to support probing on the functions
which are selected by GNU indirect function because those are chosen
at runtime. I think we need a user-mode helper in uprobes to find which
one is chosen at runtime. (Oleg, Srikar, would you have any idea?)

While cleaning up the patches, I also found a memory leak problem
so fixed it ([3/4]).

Thank you,

---

Masami Hiramatsu (4):
perf-probe: Avoid setting probes on same address on same event
perf-probe: Fix wrong variable warning when the probe point is not found
perf-probe: Fix memory leakage when the probe point is not found
perf-probe: Warn if the target function is GNU Indirect function


tools/perf/util/probe-event.c | 14 ++++++++++++++
tools/perf/util/probe-finder.c | 5 ++++-
2 files changed, 18 insertions(+), 1 deletion(-)

--
Masami Hiramatsu (Linaro) <[email protected]>


2020-07-09 08:10:03

by Masami Hiramatsu

[permalink] [raw]
Subject: [PATCH 2/4] perf-probe: Fix wrong variable warning when the probe point is not found

Fix a wrong "variable not found" warning when the probe point is
not found in the debuginfo.
Since the debuginfo__find_probes() can return 0 even if it does not
find given probe point in the debuginfo, fill_empty_trace_arg() can
be called with tf.ntevs == 0 and it can warn a wrong warning.
To fix this, reject ntevs == 0 in fill_empty_trace_arg().

E.g. without this patch;

# perf probe -x /lib64/libc-2.30.so -a "memcpy arg1=%di"
Failed to find the location of the '%di' variable at this address.
Perhaps it has been optimized out.
Use -V with the --range option to show '%di' location range.
Added new events:
probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)

You can now use it in all perf tools, such as:

perf record -e probe_libc:memcpy -aR sleep 1

With this;

# perf probe -x /lib64/libc-2.30.so -a "memcpy arg1=%di"
Added new events:
probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)

You can now use it in all perf tools, such as:

perf record -e probe_libc:memcpy -aR sleep 1


Reported-by: Andi Kleen <[email protected]>
Fixes: cb4027308570 ("perf probe: Trace a magic number if variable is not found")
Cc: [email protected]
Signed-off-by: Masami Hiramatsu <[email protected]>
---
tools/perf/util/probe-finder.c | 3 +++
1 file changed, 3 insertions(+)

diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
index 55924255c535..9963e4e8ea20 100644
--- a/tools/perf/util/probe-finder.c
+++ b/tools/perf/util/probe-finder.c
@@ -1408,6 +1408,9 @@ static int fill_empty_trace_arg(struct perf_probe_event *pev,
char *type;
int i, j, ret;

+ if (!ntevs)
+ return -ENOENT;
+
for (i = 0; i < pev->nargs; i++) {
type = NULL;
for (j = 0; j < ntevs; j++) {

2020-07-09 14:46:19

by Andi Kleen

[permalink] [raw]
Subject: Re: [PATCH 2/4] perf-probe: Fix wrong variable warning when the probe point is not found

On Thu, Jul 09, 2020 at 05:07:12PM +0900, Masami Hiramatsu wrote:
> Fix a wrong "variable not found" warning when the probe point is
> not found in the debuginfo.
> Since the debuginfo__find_probes() can return 0 even if it does not
> find given probe point in the debuginfo, fill_empty_trace_arg() can
> be called with tf.ntevs == 0 and it can warn a wrong warning.
> To fix this, reject ntevs == 0 in fill_empty_trace_arg().
>
> E.g. without this patch;
>
> # perf probe -x /lib64/libc-2.30.so -a "memcpy arg1=%di"
> Failed to find the location of the '%di' variable at this address.
> Perhaps it has been optimized out.
> Use -V with the --range option to show '%di' location range.
> Added new events:
> probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
> probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
>
> You can now use it in all perf tools, such as:
>
> perf record -e probe_libc:memcpy -aR sleep 1
>
> With this;
>
> # perf probe -x /lib64/libc-2.30.so -a "memcpy arg1=%di"
> Added new events:
> probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
> probe_libc:memcpy (on memcpy in /usr/lib64/libc-2.30.so with arg1=%di)
>
> You can now use it in all perf tools, such as:
>
> perf record -e probe_libc:memcpy -aR sleep 1
>
>
> Reported-by: Andi Kleen <[email protected]>
> Fixes: cb4027308570 ("perf probe: Trace a magic number if variable is not found")
> Cc: [email protected]
> Signed-off-by: Masami Hiramatsu <[email protected]>

Tested-by: Andi Kleen <[email protected]>

Except for the minor nit on the message all patches look good to me.

-Andi

2020-07-10 11:16:48

by Srikar Dronamraju

[permalink] [raw]
Subject: Re: [PATCH 2/4] perf-probe: Fix wrong variable warning when the probe point is not found

* Masami Hiramatsu <[email protected]> [2020-07-09 17:07:12]:

> Fix a wrong "variable not found" warning when the probe point is
> not found in the debuginfo.
> Since the debuginfo__find_probes() can return 0 even if it does not
> find given probe point in the debuginfo, fill_empty_trace_arg() can
> be called with tf.ntevs == 0 and it can warn a wrong warning.
> To fix this, reject ntevs == 0 in fill_empty_trace_arg().
>
>
>
> Reported-by: Andi Kleen <[email protected]>
> Fixes: cb4027308570 ("perf probe: Trace a magic number if variable is not found")
> Cc: [email protected]
> Signed-off-by: Masami Hiramatsu <[email protected]>

Looks good to me.

Reviewed-by: Srikar Dronamraju <[email protected]>

> ---
> tools/perf/util/probe-finder.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c
> index 55924255c535..9963e4e8ea20 100644
> --- a/tools/perf/util/probe-finder.c
> +++ b/tools/perf/util/probe-finder.c
> @@ -1408,6 +1408,9 @@ static int fill_empty_trace_arg(struct perf_probe_event *pev,
> char *type;
> int i, j, ret;
>
> + if (!ntevs)
> + return -ENOENT;
> +
> for (i = 0; i < pev->nargs; i++) {
> type = NULL;
> for (j = 0; j < ntevs; j++) {
>

--
Thanks and Regards
Srikar Dronamraju