<div dir="ltr">Great. Thanks for sharing your inputs. I too learned something new.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jun 10, 2015 at 3:20 PM, Simon Marchi <span dir="ltr"><<a href="mailto:simon.marchi@polymtl.ca" target="_blank">simon.marchi@polymtl.ca</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">On 10 June 2015 at 17:28, Simon Marchi <<a href="mailto:simon.marchi@polymtl.ca">simon.marchi@polymtl.ca</a>> wrote:<br>
> On 10 June 2015 at 17:16, Chidhu R <<a href="mailto:chid1989@gmail.com">chid1989@gmail.com</a>> wrote:<br>
>> Hello,<br>
>><br>
>> I am getting compilation issues while trying to print bit field values with<br>
>> LTTng.<br>
>><br>
>> Error:<br>
>><br>
>> hello.c: In function ‘main’:<br>
>> hello.c:36:1: error: ‘typeof’ applied to a bit-field<br>
>> hello.c:36:1: error: ‘typeof’ applied to a bit-field<br>
>> hello.c:36:1: error: ‘typeof’ applied to a bit-field<br>
>> hello.c:36:1: error: ‘sizeof’ applied to a bit-field<br>
>><br>
>> Snippet:<br>
>><br>
>> struct abc{<br>
>>         int a:16;<br>
>>         int b:8;<br>
>> };<br>
>><br>
>> Line 36: tracepoint(hello_world, my_third_tracepoint, aa.a, "welcome");<br>
>> Line 37: printf("val = %x\n",aa.a);<br>
>><br>
>> tracepoint line results in compilation error.<br>
>> printf succeeds.<br>
>><br>
>> Tp definition looks like this.<br>
>><br>
>> TRACEPOINT_EVENT(<br>
>>     hello_world,<br>
>>     my_third_tracepoint,<br>
>>     TP_ARGS(<br>
>>         uint32_t, arg,<br>
>>         const char * , my_string_arg<br>
>>     ),<br>
>>     TP_FIELDS(<br>
>>         ctf_integer_hex(uint32_t, my_arg, arg)<br>
>>         ctf_string(field, my_string_arg)<br>
>>     )<br>
>> )<br>
>><br>
>> How to print bit field values?<br>
>><br>
>> Thanks<br>
>> Chid<br>
><br>
> I have no idea what the right fix would be, but an easy workaround<br>
> could be to add 0 to your value:<br>
><br>
>     tracepoint(hello_world, my_third_tracepoint, aa.a + 0, "welcome");<br>
><br>
> I just tried it and it works.<br>
><br>
> Simon<br>
<br>
</div></div>Alright, after a bit more investigation (thanks to Philippe Proulx),<br>
we found that this is caused by the SystemTap integration. If the<br>
SystemTap integration is enabled, each LTTng tracepoint also defines a<br>
SystemTap tracepoint.<br>
<br>
SystemTap uses sizeof() on the tracepoint's input arguments to find<br>
their sizes and typeof() to find their signedness. It encodes this<br>
info into a special section that then allows tools like gdb to re-use<br>
the tracepoints and get the argument values. For more information,<br>
look at the definitions of _SDT_ARGSIZE and _SDT_ARGSIGNED in<br>
/usr/include/sys/sdt.h.<br>
<br>
Pragmatically, I think that the "+ 0" trick is good enough, since it<br>
pleases SystemTap and is otherwise harmless. You could get the same<br>
result by casting your value to an integer type. However, you would<br>
need to carefully choose the size and signedness of the type you cast<br>
to, or it might alter your value. With + 0, it should work with any<br>
type.<br>
<br>
Thanks for raising this, I learned something new today.<br>
</blockquote></div><br></div>