[lttng-dev] how do I print a value from an array of structs in a userspace tracepoint?

Jérémie Galarneau jeremie.galarneau at efficios.com
Tue Aug 18 17:28:37 EDT 2015


On Tue, Aug 18, 2015 at 1:31 PM, Jeff Layton <jlayton at poochiereds.net> wrote:
> On Tue, 18 Aug 2015 13:01:23 -0400
> Jérémie Galarneau <jeremie.galarneau at efficios.com> wrote:
>
>> On Tue, Aug 18, 2015 at 8:00 AM, Jeff Layton <jlayton at poochiereds.net>
>> wrote:
>>
>> > I'd like to add a tracepoint to my code that can walk a
>> > dynamically-sized array of structs and print one of the fields from
>> > each struct. For instance, suppose I have an array of structs that
>> > looks like this:
>> >
>> > struct foo
>> > {
>> >         int bar;
>> >         int baz;
>> >         ...
>> > }
>> >
>> > At the time of the tracepoint, I know the number of elements in the
>> > array and can pass that in. Is there any way to have lttng walk the
>> > array of structs and print out only the "bar" field from each?
>> >
>> > I've tried using ctf_sequence, but it doesn't seem to do the right
>> > thing. You can't tell it that you want to print out an "int" while
>> > walking an array of differently-sized objects.
>> >
>> >
>> Indeed, sequences assume elements are of the same type/size. That would,
>> presumably, be possible using variants, but they remain unsupported by the
>> current tracer implementations.
>>
>> For now, you could serialize your fields to a dynamically-sized array and
>> extract this array using a ctf_sequence.
>>
>> Jérémie
>>
>
> I was afraid you were going to say that...Is there a way to do that
> serialization only when the tracepoint is enabled or would I have to do
> that unconditionally?
>
> I guess we could do something like this (filling in the appropriate
> name and provider of course):
>
>         if (caa_unlikely(__tracepoint_##provider##___##name.state)) {
>                 // marshal on stack array here
>                 tracepoint(...);
>         }
>
> Though we'd need to know that __tracepoint_##provider##___##name.state
> is properly set at that point. Is it?

Yes, starting from 2.7 (currently in RC), you can use the
"tracepoint_enabled"[1] macro to conditionally perform your
marshaling.

Regards,
Jérémie

[1] https://github.com/lttng/lttng-ust/blob/master/include/lttng/tracepoint.h#L48
>
> --
> Jeff Layton <jlayton at poochiereds.net>



-- 
Jérémie Galarneau
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list