Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp3492057imd; Mon, 29 Oct 2018 07:58:00 -0700 (PDT) X-Google-Smtp-Source: AJdET5fgtuaXivAPstJw7Xd80Vb/g9S/1zpM5ma71N9vu0MS4S87gb/cg/1u+dchFQhCrjSF7yLY X-Received: by 2002:a63:eb42:: with SMTP id b2-v6mr13966242pgk.348.1540825080456; Mon, 29 Oct 2018 07:58:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1540825080; cv=none; d=google.com; s=arc-20160816; b=PgNkw83KEwEEwNRG2j9VhGZI4Nqw/Pfbi984e5CR2jamOlwYcdGK+kvsZRYlzQCtJS tfYcV56mHr/zuiE4MdpQGAM9v4qxbuwUPlc5jF4N9gbFEnMJO2vUDeSEEHbQb96GnMBA KtgTdGWfbI0QDJtATn/Y9VYXCgytpGI1hGsgWXuz9Ri4vCqyQ+ARt09gTHclfMc96axs iN9F8R3HntovfI3v0myntkbr0jw4yQLJMGfEjPDi1KHlzf2Zb/4HPZX9Sq8BgFbVubzI xiLQz858PLzrlC8dP7CLAIwqxzVpkH7YhgC6j5T826IW8UqcTr3jwUoVdy9wcaj8j4/k OQqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=jtF/E/w1YwqUOyKQ++cGjdfJO1wIjwCONBK07Kp+3GU=; b=o5DDKAc/ekO285i3HsNQ91hxaBpCTwSRNYsmgl1D/iExHy9y8d5GWSJjyJomaUclx1 XaTkSjFZDqdSgHZhgOEL/O3+uZvjyRSgYhB5xdRnuU345sRIW6aNZvUNf8pJQMHzDCFQ CuE7FGK8k53qKNtsRUdFunt4id11ElidvO/Of+J1rSM5Lzaiqk2HMSC+YCYnZA0jR4UP KyMX4+PKpQvPmhd9RSqpHXcEi+iLW8gPg1nPLMx3djL9fzqYOPleHmvvjivQ3Yt8hoqT b8VTPIEExlKIBXh0JkZ2Hc2tLcRBK/n+jGutpQvaje3RMF2A7z/NcMYhd+mlE5KhqRnk hI4A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id o62-v6si5050196pfg.79.2018.10.29.07.57.44; Mon, 29 Oct 2018 07:58:00 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727450AbeJ2Xpo (ORCPT + 99 others); Mon, 29 Oct 2018 19:45:44 -0400 Received: from mx1.redhat.com ([209.132.183.28]:40626 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726035AbeJ2Xpo (ORCPT ); Mon, 29 Oct 2018 19:45:44 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id C338630832C8; Mon, 29 Oct 2018 14:56:44 +0000 (UTC) Received: from krava (unknown [10.43.17.150]) by smtp.corp.redhat.com (Postfix) with SMTP id 184AB10027D8; Mon, 29 Oct 2018 14:56:40 +0000 (UTC) Date: Mon, 29 Oct 2018 15:56:40 +0100 From: Jiri Olsa To: Milian Wolff Cc: acme@kernel.org, jolsa@kernel.org, Linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org, Jan Kratochvil Subject: Re: [PATCH] perf util: take pgoff into account when reporting elf to libdwfl Message-ID: <20181029145640.GA9564@krava> References: <20181029141644.3907-1-milian.wolff@kdab.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20181029141644.3907-1-milian.wolff@kdab.com> User-Agent: Mutt/1.10.1 (2018-07-13) X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.44]); Mon, 29 Oct 2018 14:56:44 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 29, 2018 at 03:16:44PM +0100, Milian Wolff wrote: > Libdwfl parses an ELF file itself and creates mappings for the > individual sections. Perf on the other hand sees raw mmap events which > represent individual sections. When we encounter an address pointing > into a mapping with pgoff != 0, we must take that into account and > report the file at the non-offset base address. > > This fixes unwinding with libdwfl in some cases. E.g. for a file like: > > ``` > #include > #include > #include > #include > #include > #include > #include > #include > > using namespace std; > > mutex g_mutex; > > double worker() > { > lock_guard guard(g_mutex); > uniform_real_distribution uniform(-1E5, 1E5); > default_random_engine engine; > double s = 0; > for (int i = 0; i < 1000; ++i) { > s += norm(complex(uniform(engine), uniform(engine))); > } > cout << s << endl; > return s; > } > > int main() > { > vector> results; > for (int i = 0; i < 10000; ++i) { > results.push_back(async(launch::async, worker)); > } > return 0; > } > ``` > > Compile it with `g++ -g -O2`, then record it with > `perf record --call-graph dwarf -e sched:sched_switch`. > > When you analyze it with `perf script` and libunwind, you should see: > > ``` > cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120 > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux) > 7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so) > 7f38e4252d0b arena_get2.part.4+0x2fb (/usr/lib/libc-2.28.so) > 7f38e4255b1c tcache_init.part.6+0xec (/usr/lib/libc-2.28.so) > 7f38e42569e5 __GI___libc_malloc+0x115 (inlined) > 7f38e4241790 __GI__IO_file_doallocate+0x90 (inlined) > 7f38e424fbbf __GI__IO_doallocbuf+0x4f (inlined) > 7f38e424ee47 __GI__IO_file_overflow+0x197 (inlined) > 7f38e424df36 _IO_new_file_xsputn+0x116 (inlined) > 7f38e4242bfb __GI__IO_fwrite+0xdb (inlined) > 7f38e463fa6d std::basic_streambuf >::sputn(char const*, long)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator >::_M_put(char const*, long)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator > std::__write(std::ostreambuf_iterator >, char const*, int)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator > std::num_put > >::_M_insert_float(std::ostreambuf_iterator > 7f38e464bd70 std::num_put > >::put(std::ostreambuf_iterator >, std::ios_base&, char, double) const+0x90 (inl> > 7f38e464bd70 std::ostream& std::ostream::_M_insert(double)+0x90 (/usr/lib/libstdc++.so.6.0.25) > 563b9cb502f7 std::ostream::operator<<(double)+0xb7 (inlined) > 563b9cb502f7 worker()+0xb7 (/ssd/milian/projects/kdab/rnd/hotspot/build/tests/test-clients/cpp-locking/cpp-locking) > 563b9cb506fb double std::__invoke_impl(std::__invoke_other, double (*&&)())+0x2b (inlined) > 563b9cb506fb std::__invoke_result::type std::__invoke(double (*&&)())+0x2b (inlined) > 563b9cb506fb decltype (__invoke((_S_declval<0ul>)())) std::thread::_Invoker >::_M_invoke<0ul>(std::_Index_tuple<0ul>)+0x2b (inlined) > 563b9cb506fb std::thread::_Invoker >::operator()()+0x2b (inlined) > 563b9cb506fb std::__future_base::_Task_setter, std::__future_base::_Result_base::_Deleter>, std::thread::_Invoker >, dou> > 563b9cb506fb std::_Function_handler (), std::__future_base::_Task_setter > 563b9cb507e8 std::function ()>::operator()() const+0x28 (inlined) > 563b9cb507e8 std::__future_base::_State_baseV2::_M_do_set(std::function ()>*, bool*)+0x28 (/ssd/milian/> > 7f38e46d24fe __pthread_once_slow+0xbe (/usr/lib/libpthread-2.28.so) > 563b9cb51149 __gthread_once+0xe9 (inlined) > 563b9cb51149 void std::call_once ()>*, bool*)> > 563b9cb51149 std::__future_base::_State_baseV2::_M_set_result(std::function ()>, bool)+0xe9 (inlined) > 563b9cb51149 std::__future_base::_Async_state_impl >, double>::_Async_state_impl(std::thread::_Invoker >&&)::{lambda()#1}::op> > 563b9cb51149 void std::__invoke_impl >, double>::_Async_state_impl(std::thread::_Invoker > 563b9cb51149 std::__invoke_result >, double>::_Async_state_impl(std::thread::_Invoker >> > 563b9cb51149 decltype (__invoke((_S_declval<0ul>)())) std::thread::_Invoker >, double>::_Async_state_> > 563b9cb51149 std::thread::_Invoker >, double>::_Async_state_impl(std::thread::_Invoker > 563b9cb51149 std::thread::_State_impl >, double>::_Async_state_impl(std::thread> > 7f38e45f0062 execute_native_thread_routine+0x12 (/usr/lib/libstdc++.so.6.0.25) > 7f38e46caa9c start_thread+0xfc (/usr/lib/libpthread-2.28.so) > 7f38e42ccb22 __GI___clone+0x42 (inlined) > ``` > > Before this patch, using libdwfl, you would see: > > ``` > cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120 > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux) > 7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so) > a041161e77950c5c [unknown] ([unknown]) > ``` > > With this patch applied, we get a bit further in unwinding: > > ``` > cpp-locking 20038 [005] 54830.236589: sched:sched_switch: prev_comm=cpp-locking prev_pid=20038 prev_prio=120 prev_state=T ==> next_comm=swapper/5 next_pid=0 next_prio=120 > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb166fec5 __sched_text_start+0x545 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1670208 schedule+0x28 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb16737cc rwsem_down_read_failed+0xec (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1665e04 call_rwsem_down_read_failed+0x14 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb1672a03 down_read+0x13 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb106bd85 __do_page_fault+0x445 (/lib/modules/4.14.78-1-lts/build/vmlinux) > ffffffffb18015f5 page_fault+0x45 (/lib/modules/4.14.78-1-lts/build/vmlinux) > 7f38e4252591 new_heap+0x101 (/usr/lib/libc-2.28.so) > 7f38e4252d0b arena_get2.part.4+0x2fb (/usr/lib/libc-2.28.so) > 7f38e4255b1c tcache_init.part.6+0xec (/usr/lib/libc-2.28.so) > 7f38e42569e5 __GI___libc_malloc+0x115 (inlined) > 7f38e4241790 __GI__IO_file_doallocate+0x90 (inlined) > 7f38e424fbbf __GI__IO_doallocbuf+0x4f (inlined) > 7f38e424ee47 __GI__IO_file_overflow+0x197 (inlined) > 7f38e424df36 _IO_new_file_xsputn+0x116 (inlined) > 7f38e4242bfb __GI__IO_fwrite+0xdb (inlined) > 7f38e463fa6d std::basic_streambuf >::sputn(char const*, long)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator >::_M_put(char const*, long)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator > std::__write(std::ostreambuf_iterator >, char const*, int)+0x1cd (inlined) > 7f38e463fa6d std::ostreambuf_iterator > std::num_put > >::_M_insert_float(std::ostreambuf_iterator > 7f38e464bd70 std::num_put > >::put(std::ostreambuf_iterator >, std::ios_base&, char, double) const+0x90 (inl> > 7f38e464bd70 std::ostream& std::ostream::_M_insert(double)+0x90 (/usr/lib/libstdc++.so.6.0.25) > 563b9cb502f7 std::ostream::operator<<(double)+0xb7 (inlined) > 563b9cb502f7 worker()+0xb7 (/ssd/milian/projects/kdab/rnd/hotspot/build/tests/test-clients/cpp-locking/cpp-locking) > 6eab825c1ee3e4ff [unknown] ([unknown]) > ``` > > Note that the backtrace is still stopping too early, when > compared to the nice results obtained via libunwind. It's > unclear so far what the reason for that is. looks good to me Acked-by: Jiri Olsa Cc-ing Jan, who helped putting this together and might have some ideas on what's still missing thanks, jirka > > Signed-off-by: Milian Wolff > Cc: Arnaldo Carvalho de Melo > Cc: Jiri Olsa > --- > tools/perf/util/unwind-libdw.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > diff --git a/tools/perf/util/unwind-libdw.c b/tools/perf/util/unwind-libdw.c > index 6f318b15950e..5eff9bfc5758 100644 > --- a/tools/perf/util/unwind-libdw.c > +++ b/tools/perf/util/unwind-libdw.c > @@ -45,13 +45,13 @@ static int __report_module(struct addr_location *al, u64 ip, > Dwarf_Addr s; > > dwfl_module_info(mod, NULL, &s, NULL, NULL, NULL, NULL, NULL); > - if (s != al->map->start) > + if (s != al->map->start - al->map->pgoff) > mod = 0; > } > > if (!mod) > mod = dwfl_report_elf(ui->dwfl, dso->short_name, > - (dso->symsrc_filename ? dso->symsrc_filename : dso->long_name), -1, al->map->start, > + (dso->symsrc_filename ? dso->symsrc_filename : dso->long_name), -1, al->map->start - al->map->pgoff, > false); > > return mod && dwfl_addrmodule(ui->dwfl, ip) == mod ? 0 : -1; > -- > 2.19.1