[lttng-dev] [PATCH] Introduce vtracef

Maxime Roussin-Bélanger maxime.roussinbelanger at gmail.com
Fri Jan 31 18:17:24 EST 2020


Hi Simon,

On Fri, Jan 31, 2020 at 6:03 PM Simon Marchi <simark at simark.ca> wrote:
>
> Hi Maxime,
>
> Tip for next time: this mailing is used for many projects, so it helps
> to include the project name in the patch prefix.  You can do so by using
>
>   --subject-prefix="PATCH lttng-ust"
>
> on you git-send-email command line.

Will do!

>
> On 2020-01-31 4:55 p.m., Maxime Roussin-Belanger wrote:
> > vtracef accepts a va_list argument to simplify tracing
> > functions which use a va_list
> >
> > Here's an example from wpa_supplicant that I wanted to
> > trace:
> >
> > void wpa_debug(int level, const char* fmt, ...) {
> >
> >     va_list ap;
> >     va_start(ap, fmt);
> >
> >     ...
> >     // The call I want to easily trace with vtracef
> >     vprintf(fmt, ap);
> >
> >     ...
> >     va_end(ap);
> > }
> >
> > wpa_debug is used a fair amount and it would be annoying to
> > replace all the wpa_debug calls with tracef.
> >
> > With vtracef, it simplifies the find and replace effort by
> > only changing it at one place.
>
> The shortcoming, as you mentiond on IRC, is that it doesn't support SDT
integration.  The tracef
> macro call has a `STAP_PROBEV` call, but it doesn't seem possible to use
that here.  The number
> of arguments in a va_list is known at runtime (in fact it's not really
known by the va_list itself),
> whereas STAP_PROBEV wants to know the number of arguments at compile time.
>
> I think it would still be useful to have vtracef, for the use case
explained above, but have it
> documented that it is not integrated with the stap probes (unless
somebody has a magic idea that
> would make it work).  But that will be for the maintainer to decide.

Where would that be? In the man page? If so it would be the first time
editing/creating a man page.
It seems fairly simple, but I probably need some guidance on where to start.

>
> Note that if the feature is accepted, it will require at least a man page
update. An update in
> doc/examples/demo-tracef/demo-tracef.c would also be nice, to have an
example of how it can be used.

Looking at the example, maybe I should create another file demo-vtracef.c?

Max.

>
> Simon
>
> >
> > Signed-off-by: Maxime Roussin-Belanger <maxime.roussinbelanger at gmail.com
>
> > ---
> >  include/lttng/tracef.h | 10 ++++++++++
> >  liblttng-ust/tracef.c  | 18 +++++++++++-------
> >  2 files changed, 21 insertions(+), 7 deletions(-)
> >
> > diff --git a/include/lttng/tracef.h b/include/lttng/tracef.h
> > index 0c59c9ae..e3a7587d 100644
> > --- a/include/lttng/tracef.h
> > +++ b/include/lttng/tracef.h
> > @@ -32,13 +32,23 @@ extern "C" {
> >  extern
> >  void _lttng_ust_tracef(const char *fmt, ...);
> >
> > +extern
> > +void _lttng_ust_vtracef(const char *fmt, va_list ap);
> > +
> >  #define tracef(fmt, ...)                                             \
> >       do {                                                            \
> >               LTTNG_STAP_PROBEV(tracepoint_lttng_ust_tracef, event, ##
__VA_ARGS__); \
> >               if
(caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
> >                       _lttng_ust_tracef(fmt, ## __VA_ARGS__);         \
> >       } while (0)
> >
> > +#ifndef LTTNG_UST_HAVE_SDT_INTEGRATION
> > +#define vtracef(fmt, ap)                                             \
> > +     do {                                                            \
> > +             if
(caa_unlikely(__tracepoint_lttng_ust_tracef___event.state)) \
> > +                     _lttng_ust_vtracef(fmt, ap);            \
> > +     } while (0)
> > +#endif
>
> If we end up with what I suggested above (vtracef documented not to
integrate an
> stap probe), this #ifndef would go away,
>
> >  #ifdef __cplusplus
> >  }
> >  #endif
> > diff --git a/liblttng-ust/tracef.c b/liblttng-ust/tracef.c
> > index ea98e43e..2a809eed 100644
> > --- a/liblttng-ust/tracef.c
> > +++ b/liblttng-ust/tracef.c
> > @@ -29,20 +29,24 @@
> >  #define TRACEPOINT_DEFINE
> >  #include "lttng-ust-tracef-provider.h"
> >
> > -void _lttng_ust_tracef(const char *fmt, ...)
> > +void _lttng_ust_vtracef(const char *fmt, va_list ap)
> >  {
> > -     va_list ap;
> >       char *msg;
> > -     int len;
> > -
> > -     va_start(ap, fmt);
> > -     len = vasprintf(&msg, fmt, ap);
> > +     const int len = vasprintf(&msg, fmt, ap);
> >       /* len does not include the final \0 */
> >       if (len < 0)
> > -             goto end;
> > +             return;
>
> We try to have a single exit point in each function, to facilitate
> resource management in the case of errors, so please keep the goto
> end pattern:
>
>   ...
>
>   if (len < 0)
>     goto end;
>
>   ...
>
> end:
>   return
> }
>
> >       __tracepoint_cb_lttng_ust_tracef___event(msg, len,
> >               LTTNG_UST_CALLER_IP());
> >       free(msg);
> > +}
> > +
> > +void _lttng_ust_tracef(const char *fmt, ...)
> > +{
> > +     va_list ap;
> > +
> > +     va_start(ap, fmt);
> > +     _lttng_ust_vtracef(fmt, ap);
> >  end:
>
> You can remove the end label here.
>
> Simon
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.lttng.org/pipermail/lttng-dev/attachments/20200131/ae6ac615/attachment.html>


More information about the lttng-dev mailing list