usttrace: enhance
[ust.git] / usttrace
CommitLineData
eb6adb25
PMF
1#!/bin/bash
2
4a7c7161
PMF
3# usttrace by Pierre-Marc Fournier 2009
4# Distributed under the GPLv2.
5
cd814711
PMF
6USTTRACE_DIR="$(dirname $0)"
7USTD="${USTTRACE_DIR}/ustd/ustd"
8LIBINTERFORK_PATH="${USTTRACE_DIR}/libinterfork/.libs/libinterfork.so"
9LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libmallocwrap/.libs/libmallocwrap.so"
b13ba584 10
cd814711 11STD_LDLIBRARY_UST="${USTTRACE_DIR}/libust/.libs"
eb6adb25 12
cd814711 13BASE_TRACE_DIR="${HOME}/.usttraces"
eb6adb25
PMF
14
15function usage () {
b13ba584
PMF
16 echo "usage: $0 OPTIONS COMMAND" 2>/dev/stderr
17 echo "" 2>/dev/stderr
18 echo "Options:" 2>/dev/stderr
19 echo " -l Runtime link with UST library." 2>/dev/stderr
20 echo " (Needed only if program was not linked at compile time with libust.)" 2>/dev/stderr
21 echo " -L Add path to ust libraries to LD_LIBRARY_PATH." 2>/dev/stderr
22 echo " -m Instrument malloc calls." 2>/dev/stderr
23 echo " -f Also trace forked processes." 2>/dev/stderr
89a10f62 24 echo " -s Use system-wide daemon instead of creating one for this session." 2>/dev/stderr
eb6adb25
PMF
25}
26
27function error() {
28 echo "$0: error: $1" 2>/dev/stderr
29}
30
89a10f62 31while getopts ":hlLmfs" options; do
b13ba584
PMF
32 case $options in
33 l) arg_preload_libust=1;;
34 L) arg_ld_std_ust=1;;
35 m) arg_preload_malloc=1;;
36 f) arg_preload_fork=1;;
89a10f62 37 s) arg_syswide_daemon=1;;
b13ba584
PMF
38 h) usage;
39 exit 0;;
2a3fba49 40 \?) usage
b13ba584 41 exit 1;;
2a3fba49 42 *) usage
b13ba584
PMF
43 exit 1;;
44 esac
45done
46shift $(($OPTIND - 1))
47
cd814711
PMF
48if [ ! -x "$USTD" ];
49then
50 error "specified path to ustd not executable ($USTD)"
51 exit 1
52fi
53
eb6adb25
PMF
54# Prepare vars
55CMD=$1
56
57# Validate input
58if [ -z "$HOME" ];
59then
60 error "no home specified"
61fi
62
63if [ -z "$CMD" ];
64then
65 error "no command specified"
66 usage;
67 exit 1
68fi
69
70# Create directory for trace output
71DATESTRING="$(hostname)-$(date +%Y%m%d%H%M%S)"
72OUTDIR="$BASE_TRACE_DIR/$DATESTRING"
73mkdir -p "$OUTDIR"
74
75# Choose socket path
76SOCKPATH="/tmp/ust-sock-$$"
77
89a10f62
PMF
78if [ "$arg_syswide_daemon" != "1" ];
79then
80 # Start daemon
81 $USTD -s "$SOCKPATH" -o "$OUTDIR" 2>&1 >"$OUTDIR/ustd.log" &
82 USTDPID="$!"
83 export UST_DAEMON_SOCKET="$SOCKPATH"
84fi
85
86# Wait for the daemon to settle
87# If we don't, the process may try to connect to its socket before
88# it's ready.
bce2937a
PMF
89# FIXME: is there a way to make sure this works every time? Yes,
90# we could have a mode where ustd daemonizes itself. Therefore
91# by the time the control returns to the console, it's ready.
92
89a10f62 93sleep 0.5
eb6adb25
PMF
94
95# Establish the environment for the command
96export UST_TRACE=1
97export UST_AUTOPROBE=1
eb6adb25 98
b13ba584
PMF
99if [ "$arg_preload_libust" = "1" ];
100then
101 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./libust/.libs"
102 export LD_PRELOAD="$LD_PRELOAD:./libust/.libs/libust.so"
103fi
104
89a10f62
PMF
105if [ "$arg_ld_std_ust" = "1" ];
106then
107 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$STD_LDLIBRARY_UST"
108fi
109
b13ba584
PMF
110if [ "$arg_preload_malloc" = "1" ];
111then
112 export LD_PRELOAD="$LD_PRELOAD:./libmallocwrap/.libs/libmallocwrap.so"
113fi
114
115if [ "$arg_preload_fork" = "1" ];
116then
89a10f62 117 export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH"
b13ba584
PMF
118fi
119
89a10f62
PMF
120# Install a handler for SIGIO. This is the signal that will be sent by ustd to
121# the traced program to trigger the creation of its listener thread. However,
122# it is possible that the SIGIO will be sent after the shell fork, but before
123# the exec of the command. If this handler isn't there, bash might terminate
124# because of a unhandled signal.
b13ba584 125
eb6adb25 126# Execute the command
89a10f62 127bash -c "$CMD" 2>&1 | tee "$OUTDIR/app.log"
eb6adb25
PMF
128
129## Because of the keepalive mechanism, we're sure that by the time
130## we get here, the daemon is connected to all the buffers that still exist.
131## Therefore we can politely ask it to die when it's done.
132
89a10f62
PMF
133if [ "$arg_syswide_daemon" != "1" ];
134then
135 # Tell the daemon to die
136 kill -SIGTERM "$USTDPID"
137
138 echo "Waiting for ustd to shutdown..."
139 wait "$USTDPID"
140fi
eb6adb25 141
89a10f62 142echo "Trace was output in: " $OUTDIR
This page took 0.028881 seconds and 4 git commands to generate.