From mboxrd@z Thu Jan 1 00:00:00 1970 From: chid1989@gmail.com (Chidhu R) Date: Thu, 11 Jun 2015 11:11:02 -0700 Subject: [lttng-dev] Printing bit fields with LTTng In-Reply-To: References: Message-ID: Great. Thanks for sharing your inputs. I too learned something new. On Wed, Jun 10, 2015 at 3:20 PM, Simon Marchi wrote: > On 10 June 2015 at 17:28, Simon Marchi wrote: > > On 10 June 2015 at 17:16, Chidhu R wrote: > >> Hello, > >> > >> I am getting compilation issues while trying to print bit field values > with > >> LTTng. > >> > >> Error: > >> > >> hello.c: In function ?main?: > >> hello.c:36:1: error: ?typeof? applied to a bit-field > >> hello.c:36:1: error: ?typeof? applied to a bit-field > >> hello.c:36:1: error: ?typeof? applied to a bit-field > >> hello.c:36:1: error: ?sizeof? applied to a bit-field > >> > >> Snippet: > >> > >> struct abc{ > >> int a:16; > >> int b:8; > >> }; > >> > >> Line 36: tracepoint(hello_world, my_third_tracepoint, aa.a, "welcome"); > >> Line 37: printf("val = %x\n",aa.a); > >> > >> tracepoint line results in compilation error. > >> printf succeeds. > >> > >> Tp definition looks like this. > >> > >> TRACEPOINT_EVENT( > >> hello_world, > >> my_third_tracepoint, > >> TP_ARGS( > >> uint32_t, arg, > >> const char * , my_string_arg > >> ), > >> TP_FIELDS( > >> ctf_integer_hex(uint32_t, my_arg, arg) > >> ctf_string(field, my_string_arg) > >> ) > >> ) > >> > >> How to print bit field values? > >> > >> Thanks > >> Chid > > > > I have no idea what the right fix would be, but an easy workaround > > could be to add 0 to your value: > > > > tracepoint(hello_world, my_third_tracepoint, aa.a + 0, "welcome"); > > > > I just tried it and it works. > > > > Simon > > Alright, after a bit more investigation (thanks to Philippe Proulx), > we found that this is caused by the SystemTap integration. If the > SystemTap integration is enabled, each LTTng tracepoint also defines a > SystemTap tracepoint. > > SystemTap uses sizeof() on the tracepoint's input arguments to find > their sizes and typeof() to find their signedness. It encodes this > info into a special section that then allows tools like gdb to re-use > the tracepoints and get the argument values. For more information, > look at the definitions of _SDT_ARGSIZE and _SDT_ARGSIGNED in > /usr/include/sys/sdt.h. > > Pragmatically, I think that the "+ 0" trick is good enough, since it > pleases SystemTap and is otherwise harmless. You could get the same > result by casting your value to an integer type. However, you would > need to carefully choose the size and signedness of the type you cast > to, or it might alter your value. With + 0, it should work with any > type. > > Thanks for raising this, I learned something new today. > -------------- next part -------------- An HTML attachment was scrubbed... URL: