[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <506CECAA.6080205@hitachi.com>
Date: Thu, 04 Oct 2012 10:55:54 +0900
From: Masami Hiramatsu <masami.hiramatsu.pt@...achi.com>
To: Mark Wielaard <mjw@...hat.com>,
Steven Rostedt <rostedt@...dmis.org>
Cc: Arnaldo Carvalho de Melo <acme@...radead.org>,
Ingo Molnar <mingo@...e.hu>, Michal Marek <mmarek@...e.cz>,
Andi Kleen <andi@...stfloor.org>,
Peter Zijlstra <a.p.zijlstra@...llo.nl>,
linux-kernel@...r.kernel.org, Ingo Molnar <mingo@...hat.com>,
Paul Mackerras <paulus@...ba.org>, systemtap@...rceware.org,
yrl.pp-manager.tt@...achi.com
Subject: Re: Re: [PATCH -tip ] [BUGFIX] perf probe: Add a workaround for
GCC -mfentry
(2012/10/04 1:00), Mark Wielaard wrote:
> On Wed, 2012-10-03 at 09:53 -0400, Steven Rostedt wrote:
>> On Wed, 2012-10-03 at 21:17 +0900, Masami Hiramatsu wrote:
>>> <1><9a58>: Abbrev Number: 86 (DW_TAG_subprogram)
>>> <9a59> DW_AT_external : 1
>>> <9a59> DW_AT_name : (indirect string, offset: 0xd82): unregister_di
>>> e_notifier
>>> <9a5d> DW_AT_decl_file : 1
>>> <9a5e> DW_AT_decl_line : 551
>>> <9a60> DW_AT_prototyped : 1
>>> <9a60> DW_AT_type : <0x7c>
>>> <9a64> DW_AT_low_pc : 0x740
>>> <9a6c> DW_AT_high_pc : 0x75a
>>> <9a74> DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa)
>>> <9a76> DW_AT_GNU_all_call_sites: 1
>>> <9a76> DW_AT_sibling : <0x9aac>
>>> <2><9a7a>: Abbrev Number: 87 (DW_TAG_formal_parameter)
>>> <9a7b> DW_AT_name : nb
>>> <9a7e> DW_AT_decl_file : 1
>>> <9a7f> DW_AT_decl_line : 551
>>> <9a81> DW_AT_type : <0x2a96>
>>> <9a85> DW_AT_location : 0x172f (location list)
>>> ...
>>> 0000172f 0000000000000745 0000000000000750 (DW_OP_reg5 (rdi))
>>> 0000172f 0000000000000750 0000000000000757 (DW_OP_reg4 (rsi))
>>> 0000172f 0000000000000757 000000000000075a (DW_OP_GNU_entry_value: (DW_OP_reg5 (rdi)); DW_OP_stack_value)
>>> 0000172f <End of list>
>>> -----
>>>
>>> As you can see, the location of the parameter "nb", starts from 0x745
>>> but unregister_die_notifier() function itself starts from 0x740.
>>
>> Um, no I can't see. I guess I need to go and read up on DWARF formats.
>> Any good recommended links?
>>
>> A quick google gives me:
>>
>> http://en.wikipedia.org/wiki/DWARF
>> http://wiki.dwarfstd.org/index.php?title=Dwarf_FAQ
>> http://www.eagercon.com/dwarf/dwarf-2.0.0.pdf
>>
>> Is this what you recommend reading? Or is there better documentation?
>
> DWARF2 is pretty old, the latest DWARF standard is
> http://www.dwarfstd.org/Dwarf4Std.php
> If you like details then you'll want to read section 2.5 DWARF
> Expressions and 2.6 Location Descriptions. (That is what the
> DW_AT_location attribute for the DW_TAG_formal_parameter points at.) You
> might also want to read a bit about some of the DWARF5/GNU extensions
> commonly used. I tried to add references to them on this page:
> https://fedorahosted.org/elfutils/wiki/DwarfExtensions
> (Look for the Expression Opcodes)
>
> So in the above example it tries to say that for function (subprogram)
> "unregister_di_notifier" runs from (low_pc) 0x740 till (high_pc) 0x75a
> and for the parameter "nb" the value can be found in the rdi register
> from address 0x745 till 0x750, in register rsi from address 0x750 till
> 0x575 and for 0x757 till 0x75a it would be the value of register rsi as
> it was on function entry (yes, that just means it isn't available
> anymore and you need to either unwind to function start to get it or
> have it recorded on function entry to retrieve it at this point). The
> above also implies that from address 0x740 till 0x745 GCC didn't record
> the location of nb (or it just hasn't materialized yet).
>
> Note that the GCC hackers already seem to have identified why that is in
> this case: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54793#c2
Thanks for the perfect explanation!
And sorry, I should explain not why but what happened...
Without this patch, perf probe doesn't work correctly about finding
function parameters on function entries.
----
# ./perf probe -V vfs_read
Available variables at vfs_read
@<vfs_read+0>
(No matched variables)
----
Not only showing parameters, but also setting parameters failed.
----
# ./perf probe vfs_read buf
Failed to find the location of buf at this address.
Perhaps, it has been optimized out.
Failed to find 'buf' in this function.
Error: Failed to add events. (-2)
----
With this patch, perf can handle parameters again.
----
# ./perf probe -V vfs_read
Available variables at vfs_read
@<vfs_read+0>
char* buf
loff_t* pos
size_t count
struct file* file
----
and
----
# ./perf probe vfs_read buf
Added new event:
probe:vfs_read (on vfs_read with buf)
You can now use it in all perf tools, such as:
perf record -e probe:vfs_read -aR sleep 1
----
Thank you,
--
Masami HIRAMATSU
IT Management Research Dept. Linux Technology Center
Hitachi, Ltd., Yokohama Research Laboratory
E-mail: masami.hiramatsu.pt@...achi.com
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists