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

Jeff Layton jlayton at poochiereds.net
Tue Aug 18 13:31:26 EDT 2015


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?

-- 
Jeff Layton <jlayton at poochiereds.net>



More information about the lttng-dev mailing list