X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=usttrace;h=15336f638d91ab7133842d149456667b3033d162;hb=0f3af9f075344751c71324bbbe66fdeb8a5f0a6f;hp=e8ab13c7079ea2ca84eaa048805e2e13ae58bc0c;hpb=2a3fba4984dd15c145ba58803c6fa3cf557c34dc;p=ust.git diff --git a/usttrace b/usttrace index e8ab13c..15336f6 100755 --- a/usttrace +++ b/usttrace @@ -3,13 +3,30 @@ # usttrace by Pierre-Marc Fournier 2009 # Distributed under the GPLv2. -USTD="./ustd/ustd" -LIBINTERFORK_PATH="./libinterfork/.libs/libinterfork.so" -LIBMALLOCWRAP_PATH="./libmallocwrap/.libs/libmallocwrap.so" +function error() { + echo "$0: error: $1" 2>/dev/stderr +} -STD_LDLIBRARY_UST="./libust/.libs:../liburcu" +USTTRACE_DIR="$(dirname $0)" +if [ -x "${USTTRACE_DIR}/ustd/ustd" ] ; then + # Use the not installed libraries instead + USTD="${USTTRACE_DIR}/ustd/ustd" + LIBINTERFORK_PATH="${USTTRACE_DIR}/libinterfork/.libs/libinterfork.so" + LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libmallocwrap/.libs/libmallocwrap.so" + LIBUST_PATH="${USTTRACE_DIR}/libust/.libs/libust.so" +else + # Use the libraries that the dynamic link finds + USTD="ustd" + if [ ! -x "$(which ustd 2>/dev/null)" ]; then + error "cannot find an executable ustd; make sure its location is in the PATH" + exit 1 + fi + LIBINTERFORK_PATH="libinterfork.so" + LIBMALLOCWRAP_PATH="libmallocwrap.so" + LIBUST_PATH="libust.so" +fi -BASE_TRACE_DIR="$HOME/.usttraces" +BASE_TRACE_DIR="${HOME}/.usttraces" function usage () { echo "usage: $0 OPTIONS COMMAND" 2>/dev/stderr @@ -23,10 +40,6 @@ function usage () { echo " -s Use system-wide daemon instead of creating one for this session." 2>/dev/stderr } -function error() { - echo "$0: error: $1" 2>/dev/stderr -} - while getopts ":hlLmfs" options; do case $options in l) arg_preload_libust=1;; @@ -45,7 +58,7 @@ done shift $(($OPTIND - 1)) # Prepare vars -CMD=$1 +CMD=$* # Validate input if [ -z "$HOME" ]; @@ -70,42 +83,50 @@ SOCKPATH="/tmp/ust-sock-$$" if [ "$arg_syswide_daemon" != "1" ]; then + pidfilepath="/tmp/usttrace-$USER-$(date +%Y%m%d%H%M%S%N)-ustd-pid" + mkfifo -m 0600 "$pidfilepath" # Start daemon - $USTD -s "$SOCKPATH" -o "$OUTDIR" 2>&1 >"$OUTDIR/ustd.log" & - USTDPID="$!" + $USTD --pidfile "$pidfilepath" -s "$SOCKPATH" -o "$OUTDIR" >"$OUTDIR/ustd.log" 2>&1 & + # ustd sets up its server socket + # ustd opens the pidfile, blocks because no one has opened it + # we open pidfile + # we block reading pidfile + # ustd writes to pidfile + # ustd closes pidfile + # we unblock reading pidfile + USTDPID="$(<$pidfilepath)" export UST_DAEMON_SOCKET="$SOCKPATH" fi -# Wait for the daemon to settle -# If we don't, the process may try to connect to its socket before -# it's ready. -# FIXME: is there a way to make sure this works every time? -sleep 0.5 - # Establish the environment for the command -export UST_TRACE=1 -export UST_AUTOPROBE=1 - -if [ "$arg_preload_libust" = "1" ]; -then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./libust/.libs" - export LD_PRELOAD="$LD_PRELOAD:./libust/.libs/libust.so" -fi - -if [ "$arg_ld_std_ust" = "1" ]; -then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$STD_LDLIBRARY_UST" -fi - -if [ "$arg_preload_malloc" = "1" ]; -then - export LD_PRELOAD="$LD_PRELOAD:./libmallocwrap/.libs/libmallocwrap.so" -fi - -if [ "$arg_preload_fork" = "1" ]; -then +( + export UST_TRACE=1 + export UST_AUTOPROBE=1 + + if [ "$arg_preload_libust" = "1" ]; + then + if [ -n "${LIBUST_PATH%libust.so}" ] ; then + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" + fi + export LD_PRELOAD="$LD_PRELOAD:$LIBUST_PATH" + fi + + if [ "$arg_ld_std_ust" = "1" ]; + then + if [ -n "$${LIBUST_PATH%libust.so}" ] ; then + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" + fi + fi + + if [ "$arg_preload_malloc" = "1" ]; + then + export LD_PRELOAD="$LD_PRELOAD:$LIBMALLOCWRAP_PATH" + fi + + if [ "$arg_preload_fork" = "1" ]; + then export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH" -fi + fi # Install a handler for SIGIO. This is the signal that will be sent by ustd to # the traced program to trigger the creation of its listener thread. However, @@ -114,7 +135,8 @@ fi # because of a unhandled signal. # Execute the command -bash -c "$CMD" 2>&1 | tee "$OUTDIR/app.log" + $CMD 2>&1 +) | tee "$OUTDIR/app.log" ## Because of the keepalive mechanism, we're sure that by the time ## we get here, the daemon is connected to all the buffers that still exist. @@ -127,6 +149,8 @@ then echo "Waiting for ustd to shutdown..." wait "$USTDPID" + + rm "$pidfilepath" fi echo "Trace was output in: " $OUTDIR