Re: perf report segfault

From: Sandipan Das
Date: Wed Oct 10 2018 - 01:44:31 EST


Hi Jiri,

Yes, this happens when entry->map is NULL. While your fix seems correct, the
following commit from Milian Wolff had already addressed this. I think this
was pulled in with one of Arnaldo's recent perf/urgent updates.

ff4ce2885af8 ("perf report: Don't try to map ip to invalid map")

Adding Milian to the loop as well.

With Regards,
Sandipan

On 10/10/18 3:50 AM, Jiri Olsa wrote:
> On Tue, Oct 09, 2018 at 04:47:31PM -0500, Anthony LaTorre wrote:
>> I can try building perf from the latest sources. I've attached the
>> perf.data and perf.data.tar.bz2 from the test program I sent earlier.
>
> cool, reproduced.. it seems to get introduced by:
> 2a9d5050dc84 perf script: Show correct offsets for DWARF-based unwinding
>
> reverting that patch fixes the issue for me, but looks like
> we could just make th attached check and prevent the crash
>
> adding Sandipan Das to the loop, the author of that commit, any idea?
>
> thanks,
> jirka
>
>
> ---
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index c4acd2001db0..ea68c805c7ac 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -2312,7 +2312,6 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
> {
> struct callchain_cursor *cursor = arg;
> const char *srcline = NULL;
> - u64 addr;
>
> if (symbol_conf.hide_unresolved && entry->sym == NULL)
> return 0;
> @@ -2320,13 +2319,15 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
> if (append_inlines(cursor, entry->map, entry->sym, entry->ip) == 0)
> return 0;
>
> - /*
> - * Convert entry->ip from a virtual address to an offset in
> - * its corresponding binary.
> - */
> - addr = map__map_ip(entry->map, entry->ip);
> + if (entry->map) {
> + /*
> + * Convert entry->ip from a virtual address to an offset in
> + * its corresponding binary.
> + */
> + u64 addr = map__map_ip(entry->map, entry->ip);
> + srcline = callchain_srcline(entry->map, entry->sym, addr);
> + }
>
> - srcline = callchain_srcline(entry->map, entry->sym, addr);
> return callchain_cursor_append(cursor, entry->ip,
> entry->map, entry->sym,
> false, NULL, 0, 0, 0, srcline);
>