[lttng-dev] Tracepoints for pthreads conditional variables

Shehab Elsayed shehabyomn at gmail.com
Thu May 3 16:37:11 EDT 2018


Thanks for the reply. Here is a link to the repo
https://github.com/ShehabElsayed/LTTng_debugging.git

It contains the LTTng source code I am using and one of the benchmarks that
is causing problems.

Shehab Y. Elsayed, MSc.
PhD Student
The Edwards S. Rogers Sr. Dept. of Electrical and Computer Engineering
University of Toronto
E-mail: shehabyomn at gmail.com
<https://webmail.rice.edu/imp/message.php?mailbox=INBOX&index=11#>

On Tue, May 1, 2018 at 10:39 AM, Jonathan Rajotte-Julien <
jonathan.rajotte-julien at efficios.com> wrote:

> Hi Shehab,
>
> Please provide a link to a lttng-ust git tree or an actual patch (git
> format-patch).
> This will help any person who might be interested in helping you including
> myself.
>
> Cheers
>
> On Tue, May 01, 2018 at 09:31:52AM -0400, Shehab Elsayed wrote:
> > Hi,
> >
> > I am trying to create wrappers for pthreads conditional variables
> functions
> > (wait, signal and broadcast) to insert tracepoints. I followed the same
> > approach done for the mutex functions already provided with lttng,
> however
> > I am running into some problems. Mainly the applications seem to get
> stuck
> > when the conditional variable wrappers are enabled.
> >
> > Here is my implementation for the wrapper functions:
> > int pthread_cond_wait(pthread_cond_t *condition, pthread_mutex_t
> > *mutex)
> >
> > {
> >
> >   static int (*cond_wait)(pthread_cond_t *, pthread_mutex_t
> > *);
> >   int retval;
> >
> >
> >
> >   if (!cond_wait)
> > {
> >
> >     cond_wait = dlsym(RTLD_NEXT, "pthread_cond_wait");
> >
> >     if (!cond_wait)
> > {
> >
> >       if (thread_in_trace)
> > {
> >
> >
> > abort();
> >
> >
> > }
> >
> >       fprintf(stderr, "unable to initialize pthread wrapper
> > library.\n");
> >       return EINVAL;
> >
> >
> > }
> >
> >
> > }
> >
> >   if (thread_in_trace)
> > {
> >
> >     return cond_wait(condition, mutex);
> >
> >
> > }
> >
> >
> >
> >   thread_in_trace =
> > 1;
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_wait_begin, condition,
> > mutex,
> >
> >     LTTNG_UST_CALLER_IP());
> >
> >   retval = cond_wait(condition, mutex);
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_wait_end, condition,
> > mutex,
> >
> >     LTTNG_UST_CALLER_IP());
> >
> >   thread_in_trace =
> > 0;
> >
> >   return retval;
> >
> > }
> >
> >
> >
> > int pthread_cond_signal(pthread_cond_t
> > *condition)
> >
> > {
> >
> >   static int (*cond_signal)(pthread_cond_t
> > *);
> >
> >   int retval;
> >
> >
> >
> >   if (!cond_signal)
> > {
> >
> >     cond_signal = dlsym(RTLD_NEXT, "pthread_cond_signal");
> >
> >     if (!cond_signal)
> > {
> >
> >       if (thread_in_trace)
> > {
> >
> >
> > abort();
> >
> >
> > }
> >
> >       fprintf(stderr, "unable to initialize pthread wrapper
> > library.\n");
> >       return EINVAL;
> >
> >
> > }
> >
> >
> > }
> >
> >   if (thread_in_trace)
> > {
> >
> >     return cond_signal(condition);
> >
> >
> > }
> >
> >
> >
> >   thread_in_trace =
> > 1;
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_signal_begin,
> > condition,
> >     LTTNG_UST_CALLER_IP());
> >
> >   retval = cond_signal(condition);
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_signal_end,
> > condition,
> >     LTTNG_UST_CALLER_IP());
> >
> >   thread_in_trace =
> > 0;
> >
> >   return retval;
> >
> > }
> >
> >
> >
> > int pthread_cond_broadcast(pthread_cond_t
> > *condition)
> >
> > {
> >
> >   static int (*cond_broadcast)(pthread_cond_t
> > *);
> >   int retval;
> >
> >
> >
> >   if (!cond_broadcast)
> > {
> >
> >     cond_broadcast = dlsym(RTLD_NEXT, "pthread_cond_broadcast");
> >
> >     if (!cond_broadcast)
> > {
> >
> >       if (thread_in_trace)
> > {
> >
> >
> > abort();
> >
> >
> > }
> >
> >       fprintf(stderr, "unable to initialize pthread wrapper
> > library.\n");
> >       return EINVAL;
> >
> >
> > }
> >
> >
> > }
> >
> >   if (thread_in_trace)
> > {
> >
> >     return cond_broadcast(condition);
> >
> >
> > }
> >
> >
> >
> >   thread_in_trace =
> > 1;
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_broadcast_begin,
> > condition,
> >     LTTNG_UST_CALLER_IP());
> >
> >   retval = cond_broadcast(condition);
> >
> >   tracepoint(lttng_ust_pthread, pthread_cond_broadcast_end,
> > condition,
> >     LTTNG_UST_CALLER_IP());
> >
> >   thread_in_trace =
> > 0;
> >
> >   return retval;
> >
> > }
> >
> > Things I have tried:
> > 1- Comment out pthread_cond_wait function --> segmentation fault
> > 2- Comment out pthread_cond_signal and _broadcast --> stuck (I can see
> the
> > program is still running but nor forward progress is being made) compared
> > to the case when the wrappers are not preloaded.
> > 3- Comment out all tracepoint related code (basically the wrapper just
> call
> > the corresponding pthreads function) --> same results as points 1 and 2.
> >
> > Any idea what might be causing this or how I could debug this problem?
> >
> > Thank you very much in advance.
> >
> > Best Regards,
> > Shehab
>
> > int pthread_cond_wait(pthread_cond_t *condition, pthread_mutex_t
> *mutex)
> > {
>
>
>
> >   static int (*cond_wait)(pthread_cond_t *, pthread_mutex_t *);
>
> >   int retval;
>
> >
>
> >   if (!cond_wait) {
>
> >     cond_wait = dlsym(RTLD_NEXT, "pthread_cond_wait");
>
> >     if (!cond_wait) {
>
> >       if (thread_in_trace) {
>
> >         abort();
>
> >       }
>
> >       fprintf(stderr, "unable to initialize pthread wrapper
> library.\n");
> >       return EINVAL;
>
> >     }
>
> >   }
>
> >   if (thread_in_trace) {
>
> >     return cond_wait(condition, mutex);
>
> >   }
>
> >
>
> >   thread_in_trace = 1;
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_wait_begin, condition,
> mutex,
> >     LTTNG_UST_CALLER_IP());
>
> >   retval = cond_wait(condition, mutex);
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_wait_end, condition,
> mutex,
> >     LTTNG_UST_CALLER_IP());
>
> >   thread_in_trace = 0;
>
> >   return retval;
>
> > }
>
> >
>
> > int pthread_cond_signal(pthread_cond_t *condition)
>
> > {
>
> >   static int (*cond_signal)(pthread_cond_t *);
>
> >   int retval;
>
> >
>
> >   if (!cond_signal) {
>
> >     cond_signal = dlsym(RTLD_NEXT, "pthread_cond_signal");
>
> >     if (!cond_signal) {
>
> >       if (thread_in_trace) {
>
> >         abort();
>
> >       }
>
> >       fprintf(stderr, "unable to initialize pthread wrapper
> library.\n");
> >       return EINVAL;
>
> >     }
>
> >   }
>
> >   if (thread_in_trace) {
>
> >     return cond_signal(condition);
>
> >   }
>
> >
>
> >   thread_in_trace = 1;
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_signal_begin, condition,
>
> >     LTTNG_UST_CALLER_IP());
>
> >   retval = cond_signal(condition);
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_signal_end, condition,
>
> >     LTTNG_UST_CALLER_IP());
>
> >   thread_in_trace = 0;
>
> >   return retval;
>
> > }
>
> >
>
> > int pthread_cond_broadcast(pthread_cond_t *condition)
>
> > {
>
> >   static int (*cond_broadcast)(pthread_cond_t *);
>
> >   int retval;
>
> >
>
> >   if (!cond_broadcast) {
>
> >     cond_broadcast = dlsym(RTLD_NEXT, "pthread_cond_broadcast");
>
> >     if (!cond_broadcast) {
>
> >       if (thread_in_trace) {
>
> >         abort();
>
> >       }
>
> >       fprintf(stderr, "unable to initialize pthread wrapper
> library.\n");
> >       return EINVAL;
>
> >     }
>
> >   }
>
> >   if (thread_in_trace) {
>
> >     return cond_broadcast(condition);
>
> >   }
>
> >
>
> >   thread_in_trace = 1;
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_broadcast_begin,
> condition,
> >     LTTNG_UST_CALLER_IP());
>
> >   retval = cond_broadcast(condition);
>
> >   tracepoint(lttng_ust_pthread, pthread_cond_broadcast_end, condition,
>
> >     LTTNG_UST_CALLER_IP());
>
> >   thread_in_trace = 0;
>
> >   return retval;
>
> > }
>
> > _______________________________________________
> > lttng-dev mailing list
> > lttng-dev at lists.lttng.org
> > https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev
>
>
> --
> Jonathan Rajotte-Julien
> EfficiOS
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.lttng.org/pipermail/lttng-dev/attachments/20180503/502cc062/attachment-0001.html>


More information about the lttng-dev mailing list