Systemtap is a dynamic tracing/instrumenting tool available on Linux. Probes
that are not fired at run time have close to zero overhead.

The following probes are available for NPTL:

Thread creation & Join Probes
=============================
pthread_create - probe for pthread_create
               arg1 = pointer (pthread_t*) to thread
               arg2 = pointer (pthread_attr_t*) to attr
               arg3 = pointer (void *) to start_routine
               arg4 = arguments to start_routine
pthread_start - probe for actual thread creation
              arg1 = struct pthread (members include thread ID, process ID)
              arg2 = address of start_routine
              arg3 = pointer to the list of arguments
pthread_join - probe for pthread_join
             arg1 = thread ID
pthread_join_ret - probe for pthread_join return
                 arg1 = thread ID
                 arg2 = return value

Lock-related Probes
===================
mutex_init    - probe for pthread_mutex_init
              arg1 = address of mutex lock
mutex_acquired - probe for succ. return of pthread_mutex_lock
               arg1 = address of mutex lock
mutex_timedlock_acquired - probe for succ. return of pthread_mutex_timedlock
                         arg1 = address of mutex lock
mutex_entry   - probe for entry to the pthread_mutex_lock function
              arg1 = address of mutex lock
mutex_timedlock_entry - probe for entry to the pthread_mutex_timedlock function
                      arg1 = address of mutex lock, arg2 = address of timespec
mutex_release - probe for pthread_mutex_unlock after the successful release of a
                mutex lock
              arg1 = address of mutex lock
mutex_destroy - probe for pthread_mutex_destroy
              arg1 = address of mutex lock

wrlock_entry - probe for entry to the pthread_rwlock_wrlock function
             arg1 = address of rw lock
rdlock_entry - probe for entry to the pthread_rwlock_rdlock function
             arg1 = address of rw lock

rwlock_destroy - probe for pthread_rwlock_destroy
               arg1 = address of rw lock
wrlock_acquire_write - probe for pthread_rwlock_wrlock (after getting the lock)
                     arg1 = address of rw lock
rdlock_acquire_read - probe for pthread_rwlock_rdlock after successfully getting
                      the lock
                    arg1 = address of rw lock
rwlock_unlock - probe for pthread_rwlock_unlock
              arg1 = address of rw lock

lll_lock_wait - probe in low-level (assembly language) locking code, only fired
                when futex/FUTEX_WAIT is called (i.e. when trying to acquire a
                contented lock)
              arg1 = pointer to futex
              arg2 = flags passed to the futex system call
lll_lock_wait_private - probe in low-level (assembly language) locking code,
                        only fired when futex/FUTEX_WAIT is called (i.e. when
                        trying to acquire a contented lock)
                      arg1 = pointer to futex

lll_futex_wake - probe in low-level (assembly language) locking code, only fired
                 when futex (FUTEX_WAKE) is called
               arg1 = pointer to futex
               arg2 = number of processes to wake
               arg3 = additional flags

Condition variable Probes
=========================
cond_init - probe for pthread_cond_init
          arg1 = condition
          arg2 = attr
cond_destroy - probe for pthread_cond_destroy
             arg1 = cond
cond_wait - probe for pthread_cond_wait
          arg1 = condition
          arg2 = mutex lock
cond_timedwait - probe for pthread_cond_timedwait
               arg1 = condition
               arg2 = mutex lock
               arg3 = timespec
cond_signal - probe for pthread_cond_signal
            arg1 = condition
cond_broadcast - probe for pthread_cond_broadcast
               arg1 = condition
