Fix: building probe providers with C++ compiler
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 7 May 2015 17:25:04 +0000 (13:25 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Thu, 7 May 2015 17:30:31 +0000 (13:30 -0400)
Robert Daniels wrote:
> > I'm attempting to use lttng userspace tracing with a C++ application
> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6
> > release of lttng. I've compiled lttng-modules, lttng-ust, and
> > lttng-tools and have been able to get a simple test working with C
> > code.  When I attempt to run the hello.cxx test on my target it will
> > segfault.
>
>
> I spent a little time digging into this issue and finally discovered the
> cause of my segfault with ARM C++ tracepoints.
>
> There is a struct called 'lttng_event' in ust-events.h which contains an
> empty union 'u'.  This was the cause of my issue.  Under C, this empty union
> compiles to a zero byte member while under C++ it compiles to a one byte
> member, and in my case was four-byte aligned which caused my C++ code to
> have the 'cds_list_head node' offset incorrectly by four bytes.  This lead
> to an incorrect linked list structure which caused my issue.
>
> Since this union is empty, I simply removed it from the struct and everything
> worked correctly.
>
> I don't know the history or purpose behind this empty union so I'd like to
> know if this is a safe fix.  If it is I can submit a patch with the union
> removed.

That's a very nice catch!

We do not support building tracepoint probe provider with
g++ yet, as stated in lttng-ust(3):

"- Note for C++ support: although an application instrumented with
   tracepoints can be compiled with g++, tracepoint probes should be
   compiled with gcc (only tested with gcc so far)."

However, if it works fine with this fix, then I'm tempted to take it,
especially because removing the empty union does not appear to affect
the layout of struct lttng_event as seen from liblttng-ust, which must
be compiled with a C compiler,  and from probe providers compiled with
a C compiler. So all we are changing is the layout of a probe provider
compiled with a C++ compiler, which is anyway buggy at the moment,
because it is not compatible with the layout expected by liblttng-ust
compiled with a C compiler.

Reported-by: Robert Daniels <robert.daniels@vantagecontrols.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
include/lttng/ust-events.h

index 328a875336294f044bc5909ba45773ee1cfea1c9..3d7a2747b3795329f2994115d64e1d1cefd0f138 100644 (file)
@@ -407,8 +407,6 @@ struct lttng_event {
        void *_deprecated1;
        struct lttng_ctx *ctx;
        enum lttng_ust_instrumentation instrumentation;
-       union {
-       } u;
        struct cds_list_head node;              /* Event list in session */
        struct cds_list_head _deprecated2;
        void *_deprecated3;
This page took 0.025848 seconds and 4 git commands to generate.