X-Git-Url: http://git.lttng.org/?a=blobdiff_plain;f=usttrace;h=fe8a5cd8f8c47f80a53a72164c1ac8852d20a1a3;hb=b924c127ff931e20e6de9c88aafad0829c97de29;hp=8377272e5514be5fcb84e7d35611f1e299a86e02;hpb=b13ba58434cd56230598d262b976ac787f0943d1;p=ust.git diff --git a/usttrace b/usttrace index 8377272..fe8a5cd 100755 --- a/usttrace +++ b/usttrace @@ -3,13 +3,14 @@ # usttrace by Pierre-Marc Fournier 2009 # Distributed under the GPLv2. -USTD="./ustd/ustd" -LIBINTERFORK="./libinterfork/.libs/libinterfork.so" -LIBMALLOCWRAP="./libmallocwrap/.libs/libmallocwrap.so" +USTTRACE_DIR="$(dirname $0)" +USTD="${USTTRACE_DIR}/ustd/ustd" +LIBINTERFORK_PATH="${USTTRACE_DIR}/libinterfork/.libs/libinterfork.so" +LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libmallocwrap/.libs/libmallocwrap.so" -STD_LDLIBRARY_UST="./libust/.libs:../liburcu" +STD_LDLIBRARY_UST="${USTTRACE_DIR}/libust/.libs" -BASE_TRACE_DIR="$HOME/.usttraces" +BASE_TRACE_DIR="${HOME}/.usttraces" function usage () { echo "usage: $0 OPTIONS COMMAND" 2>/dev/stderr @@ -20,28 +21,36 @@ function usage () { echo " -L Add path to ust libraries to LD_LIBRARY_PATH." 2>/dev/stderr echo " -m Instrument malloc calls." 2>/dev/stderr echo " -f Also trace forked processes." 2>/dev/stderr + 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 ":hlLmf" options; do +while getopts ":hlLmfs" options; do case $options in l) arg_preload_libust=1;; L) arg_ld_std_ust=1;; m) arg_preload_malloc=1;; f) arg_preload_fork=1;; + s) arg_syswide_daemon=1;; h) usage; exit 0;; - \?) echo $usage + \?) usage exit 1;; - *) echo $usage + *) usage exit 1;; esac done shift $(($OPTIND - 1)) +if [ ! -x "$USTD" ]; +then + error "specified path to ustd not executable ($USTD)" + exit 1 +fi + # Prepare vars CMD=$1 @@ -66,14 +75,19 @@ mkdir -p "$OUTDIR" # Choose socket path SOCKPATH="/tmp/ust-sock-$$" -# Start daemon -$USTD -s "$SOCKPATH" -o "$OUTDIR" >"$OUTDIR/ustd.log" 2>&1 & -USTDPID=$! +if [ "$arg_syswide_daemon" != "1" ]; +then + pidfilepath="/tmp/usttrace-$USER-$(date +%Y%m%d%H%M%S%N)-ustd-pid" + + # Start daemon + $USTD -d --pidfile "$pidfilepath" -s "$SOCKPATH" -o "$OUTDIR" >"$OUTDIR/ustd.log" 2>&1 & + USTDPID="$(<$pidfilepath)" + export UST_DAEMON_SOCKET="$SOCKPATH" +fi # Establish the environment for the command export UST_TRACE=1 export UST_AUTOPROBE=1 -export UST_DAEMON_SOCKET="$SOCKPATH" if [ "$arg_preload_libust" = "1" ]; then @@ -81,6 +95,11 @@ then 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" @@ -88,23 +107,31 @@ fi if [ "$arg_preload_fork" = "1" ]; then - export LD_PRELOAD="$LD_PRELOAD:./libinterfork/.libs/libinterfork.so" + export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH" fi -if [ "$arg_ld_std_ust" = "1" ]; -then - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$STD_LDLIBRARY_UST" -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, +# it is possible that the SIGIO will be sent after the shell fork, but before +# the exec of the command. If this handler isn't there, bash might terminate +# because of a unhandled signal. # Execute the command -bash -c "$CMD" +bash -c "$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. ## Therefore we can politely ask it to die when it's done. -kill -SIGTERM "$USTDPID" +if [ "$arg_syswide_daemon" != "1" ]; +then + # Tell the daemon to die + kill -SIGTERM "$USTDPID" + + echo "Waiting for ustd to shutdown..." + wait "$USTDPID" + + rm "$pidfilepath" +fi -# Tell the daemon to die -echo "Waiting for ustd to shutdown..." -wait "$USTDPID" +echo "Trace was output in: " $OUTDIR