Commit | Line | Data |
---|---|---|
eb6adb25 PMF |
1 | #!/bin/bash |
2 | ||
4a7c7161 PMF |
3 | # usttrace by Pierre-Marc Fournier 2009 |
4 | # Distributed under the GPLv2. | |
5 | ||
63f16f2e PMF |
6 | function error() { |
7 | echo "$0: error: $1" 2>/dev/stderr | |
8 | } | |
9 | ||
87d40fcf PMF |
10 | function sighandler() { |
11 | echo "Caught Ctrl-C" | |
12 | if [ -z "$USTDPID" ]; then | |
13 | USTDPID="$(<$pidfilepath)" | |
14 | fi | |
15 | # Tell the daemon to die | |
16 | kill -SIGTERM "$USTDPID" | |
17 | ||
18 | echo "Waiting for ustd to shutdown..." | |
19 | wait "$USTDPID" | |
20 | ||
21 | rm "$pidfilepath" | |
22 | ||
23 | exit 0; | |
24 | } | |
25 | ||
cd814711 | 26 | USTTRACE_DIR="$(dirname $0)" |
6b22d5c1 JB |
27 | if [ -x "${USTTRACE_DIR}/ustd/ustd" ] ; then |
28 | # Use the not installed libraries instead | |
29 | USTD="${USTTRACE_DIR}/ustd/ustd" | |
30 | LIBINTERFORK_PATH="${USTTRACE_DIR}/libinterfork/.libs/libinterfork.so" | |
31 | LIBMALLOCWRAP_PATH="${USTTRACE_DIR}/libmallocwrap/.libs/libmallocwrap.so" | |
32 | LIBUST_PATH="${USTTRACE_DIR}/libust/.libs/libust.so" | |
33 | else | |
34 | # Use the libraries that the dynamic link finds | |
35 | USTD="ustd" | |
63f16f2e PMF |
36 | if [ ! -x "$(which ustd 2>/dev/null)" ]; then |
37 | error "cannot find an executable ustd; make sure its location is in the PATH" | |
38 | exit 1 | |
39 | fi | |
6b22d5c1 JB |
40 | LIBINTERFORK_PATH="libinterfork.so" |
41 | LIBMALLOCWRAP_PATH="libmallocwrap.so" | |
9ccc0699 | 42 | LIBUST_PATH="libust.so.0" |
6b22d5c1 | 43 | fi |
eb6adb25 | 44 | |
cd814711 | 45 | BASE_TRACE_DIR="${HOME}/.usttraces" |
eb6adb25 PMF |
46 | |
47 | function usage () { | |
b13ba584 PMF |
48 | echo "usage: $0 OPTIONS COMMAND" 2>/dev/stderr |
49 | echo "" 2>/dev/stderr | |
50 | echo "Options:" 2>/dev/stderr | |
51 | echo " -l Runtime link with UST library." 2>/dev/stderr | |
52 | echo " (Needed only if program was not linked at compile time with libust.)" 2>/dev/stderr | |
53 | echo " -L Add path to ust libraries to LD_LIBRARY_PATH." 2>/dev/stderr | |
54 | echo " -m Instrument malloc calls." 2>/dev/stderr | |
55 | echo " -f Also trace forked processes." 2>/dev/stderr | |
89a10f62 | 56 | echo " -s Use system-wide daemon instead of creating one for this session." 2>/dev/stderr |
eb6adb25 PMF |
57 | } |
58 | ||
c1a44c29 | 59 | while getopts ":hlLmfsW" options; do |
b13ba584 PMF |
60 | case $options in |
61 | l) arg_preload_libust=1;; | |
62 | L) arg_ld_std_ust=1;; | |
63 | m) arg_preload_malloc=1;; | |
64 | f) arg_preload_fork=1;; | |
89a10f62 | 65 | s) arg_syswide_daemon=1;; |
c1a44c29 | 66 | W) where=1;; |
b13ba584 PMF |
67 | h) usage; |
68 | exit 0;; | |
2a3fba49 | 69 | \?) usage |
b13ba584 | 70 | exit 1;; |
2a3fba49 | 71 | *) usage |
b13ba584 PMF |
72 | exit 1;; |
73 | esac | |
74 | done | |
75 | shift $(($OPTIND - 1)) | |
76 | ||
c1a44c29 PMF |
77 | if [ -n "$where" ]; then |
78 | echo $BASE_TRACE_DIR/$(ls "$BASE_TRACE_DIR" | tail -n 1) | |
79 | exit 0 | |
80 | fi | |
81 | ||
eb6adb25 | 82 | # Prepare vars |
6b22d5c1 | 83 | CMD=$* |
eb6adb25 PMF |
84 | |
85 | # Validate input | |
86 | if [ -z "$HOME" ]; | |
87 | then | |
88 | error "no home specified" | |
89 | fi | |
90 | ||
91 | if [ -z "$CMD" ]; | |
92 | then | |
93 | error "no command specified" | |
94 | usage; | |
95 | exit 1 | |
96 | fi | |
97 | ||
98 | # Create directory for trace output | |
04c989a4 | 99 | DATESTRING="$(hostname)-$(date +%Y%m%d%H%M%S%N)" |
eb6adb25 PMF |
100 | OUTDIR="$BASE_TRACE_DIR/$DATESTRING" |
101 | mkdir -p "$OUTDIR" | |
102 | ||
15588720 PMF |
103 | # Choose ustd socket path |
104 | USTDSOCKPATH="/tmp/ustd-sock-$$" | |
eb6adb25 | 105 | |
89a10f62 PMF |
106 | if [ "$arg_syswide_daemon" != "1" ]; |
107 | then | |
b924c127 | 108 | pidfilepath="/tmp/usttrace-$USER-$(date +%Y%m%d%H%M%S%N)-ustd-pid" |
87d40fcf | 109 | trap "sighandler $pidfilepath" SIGINT |
8232f1db | 110 | mkfifo -m 0600 "$pidfilepath" |
89a10f62 | 111 | # Start daemon |
15588720 | 112 | $USTD --pidfile "$pidfilepath" -s "$USTDSOCKPATH" -o "$OUTDIR" >"$OUTDIR/ustd.log" 2>&1 & |
0f3af9f0 PMF |
113 | # ustd sets up its server socket |
114 | # ustd opens the pidfile, blocks because no one has opened it | |
115 | # we open pidfile | |
116 | # we block reading pidfile | |
117 | # ustd writes to pidfile | |
118 | # ustd closes pidfile | |
119 | # we unblock reading pidfile | |
b924c127 | 120 | USTDPID="$(<$pidfilepath)" |
15588720 | 121 | export UST_DAEMON_SOCKET="$USTDSOCKPATH" |
89a10f62 PMF |
122 | fi |
123 | ||
eb6adb25 | 124 | # Establish the environment for the command |
6b22d5c1 JB |
125 | ( |
126 | export UST_TRACE=1 | |
127 | export UST_AUTOPROBE=1 | |
128 | ||
129 | if [ "$arg_preload_libust" = "1" ]; | |
130 | then | |
131 | if [ -n "${LIBUST_PATH%libust.so}" ] ; then | |
132 | export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" | |
133 | fi | |
134 | export LD_PRELOAD="$LD_PRELOAD:$LIBUST_PATH" | |
135 | fi | |
136 | ||
137 | if [ "$arg_ld_std_ust" = "1" ]; | |
138 | then | |
139 | if [ -n "$${LIBUST_PATH%libust.so}" ] ; then | |
140 | export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:${LIBUST_PATH%libust.so}" | |
141 | fi | |
142 | fi | |
143 | ||
144 | if [ "$arg_preload_malloc" = "1" ]; | |
145 | then | |
146 | export LD_PRELOAD="$LD_PRELOAD:$LIBMALLOCWRAP_PATH" | |
147 | fi | |
148 | ||
149 | if [ "$arg_preload_fork" = "1" ]; | |
150 | then | |
89a10f62 | 151 | export LD_PRELOAD="$LD_PRELOAD:$LIBINTERFORK_PATH" |
6b22d5c1 | 152 | fi |
b13ba584 | 153 | |
eb6adb25 | 154 | # Execute the command |
6b22d5c1 JB |
155 | $CMD 2>&1 |
156 | ) | tee "$OUTDIR/app.log" | |
eb6adb25 PMF |
157 | |
158 | ## Because of the keepalive mechanism, we're sure that by the time | |
159 | ## we get here, the daemon is connected to all the buffers that still exist. | |
160 | ## Therefore we can politely ask it to die when it's done. | |
161 | ||
89a10f62 PMF |
162 | if [ "$arg_syswide_daemon" != "1" ]; |
163 | then | |
164 | # Tell the daemon to die | |
165 | kill -SIGTERM "$USTDPID" | |
166 | ||
167 | echo "Waiting for ustd to shutdown..." | |
524a8072 | 168 | wait "$USTDPID" |
b924c127 PMF |
169 | |
170 | rm "$pidfilepath" | |
89a10f62 | 171 | fi |
eb6adb25 | 172 | |
89a10f62 | 173 | echo "Trace was output in: " $OUTDIR |