Re: Re: [PATCH -tip ] [BUGFIX] perf probe: Add a workaround forGCC -mfentry

From: Masami Hiramatsu
Date: Wed Oct 03 2012 - 21:55:54 EST


(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@xxxxxxxxxxx


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/