2 # This script starts LyX, and restarts LyX if it is closed
3 # it logs all output, including backtraces to development/keystest/out/GDB
5 #Setting the following may give better screen shots
6 #gconftool-2 /apps/metacity/general/compositing_manager -s -t bool true
8 DIRNAME0=`dirname "$0"`
10 ROOT_OUTDIR="$DIRNAME0/out"
14 BORED_AFTER_SECS=3600 #If we have spend more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
16 #############################
17 # This section of code is LyX Specific
18 #############################
20 if [ ! -e lib/doc.orig ]
22 mv lib/doc lib/doc.orig
25 ensure_cannot_print () {
27 echo We can print, this is bad!
28 echo use lpadmin to stop keytest from destroying a forest.
37 if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
39 echo making doc dir $OUTDIR/$SEC.doc
40 mkdir -p $OUTDIR/$SEC.doc
41 cp -a lib/doc/$f $OUTDIR/$SEC.doc/
49 cp -p lib/doc.orig/*.lyx lib/doc/
53 name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
54 echo $name | sed 's/ /__/g'
59 echo "$ROOT_OUTDIR/$id.reproduced"
63 echo attempting to exit this entire script... normal exit may just exit one function
67 echo We should not get this far
70 echo We really should not get this far
74 ###########################
77 echo getting pidof "$1" 1>&2
78 PID=`ps a"$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
79 echo "$PID" | ( grep " " > /dev/null && ( echo too many PIDs 1>&2 ; full_exit ) )
80 nPIDs=`echo PID "$PID" | wc -l`
81 if [ "$nPIDs" != "1" ]
83 echo autolyx: Wrong number of PIDs "$nPIDs" 1>&2
91 export CONFIRM_FILE=`calc_confirm_file`
92 if [ ! -e "$CONFIRM_FILE" ]
94 echo $CONFIRM_FILE does not exist
95 echo This bug appears not to have been reproduced before
96 echo Will try to reproduce now
100 echo Finished attempt at replay
102 echo $CONFIRM_FILE exists
103 echo This bugs has already been reproduced
104 echo Will not attempt to reproduce again
109 (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
111 echo Backgrounded $TEST_PID
112 echo waiting for $TEST_PID to finish
116 do_queued_replays() {
117 for f in `ls development/keytest/out/toreplay/*KEYCODEpure`
119 if [ ! -e "$f.replay/last_crash_sec" ]
121 #./development/keytest/killtest
125 KEYCODEpure="$f" do_replay
131 if [ ! -z "$REPLAYFILE" ]
134 OUTDIR="$REPLAYFILE.replay/"
135 mkdir -p $REPLAYFILE.replay/ || full_exit
136 export KEYTEST_INFILE=$REPLAYFILE
137 if [ ! -e "$REPLAYFILE" ]
139 echo "$REPLAYFILE" does not exist
148 get_pid [0-9].x-session-manager"$" x
149 export X_PID=`get_pid [0-9].x-session-manager x`
152 export TAIL_LINES=$TAIL_LINES
159 #rename other windows to avoid confusion.
160 wmctrl -N __renamed__ -r lyx
161 wmctrl -N __renamed__ -r lyx
162 wmctrl -N __renamed__ -r lyx
163 wmctrl -N __renamed__ -r lyx
164 export PATH=`cd $DIRNAME0; pwd`/path:$PATH
168 LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
172 export X_PID=`get_pid [0-9].x-session-manager"$" x`
176 echo Currently running autolyx PID=$$
177 if [ ! -z "$TAIL_LINES" ]
179 echo TAIL_LINES: "$TAIL_LINES"
180 TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
181 tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
182 KEYTEST_INFILE=$TAIL_FILE
189 if [ ! -z "$REPLAYFILE" ]
191 echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
192 if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
195 echo Is is now $SEC seconds
196 echo The last time we managed to eliminate a keycode was at $LAST_EVENT
197 echo We get bored after $BORED_AFTER_SECS seconds
200 echo $LAST_CRASH_SEC > $OUTDIR/Finished
202 ln $OUTDIR/$SEC* $OUTDIR/final
203 CONFIRM_FILE=`calc_confirm_file`
204 echo Reproducible > "$CONFIRM_FILE"
212 KEYCODE=$OUTDIR/$SEC.KEYCODE
213 KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
214 NEWHOME=~/kt.dir/$SEC.dir
216 NEWHOME=`cd $NEWHOME; pwd`
217 echo NEWHOME $NEWHOME
219 cp -rv ~/.lyx "$NEWHOME"/
226 while [ -z "$LYX_PID" -a 200 -gt $i ]
228 export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
229 echo LYXPID "$LYX_PID"
233 echo `ps a | grep /src/lyx`
235 echo `ps a | grep /src/lyx | grep -v grep`
237 echo `ps a | grep /src/lyx | grep -v grep | sed 's/ [a-z].*$//'`
239 echo LYX_PID=$LYX_PID
240 echo XA_PRIMARY | xclip -selection XA_PRIMARY
241 echo XA_SECONDARY | xclip -selection XA_SECONDARY
242 echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
244 if [ ! -z "$LYX_PID" ]
246 kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
248 kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
249 KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
256 #You may want to use the following to simulate SIGFPE
257 #(sleep 90 && killall -8 lyx) &
266 shell kill $CHILD_PID
267 shell import -window root '$GDB.png'
270 shell kill -9 $CHILD_PID
271 shell wmctrl -r __renamed__ -b add,shaded
272 shell wmctrl -r term -b add,shaded
273 shell wmctrl -r term -b add,shaded
275 shell import -window root '$GDB..png'
276 " ; yes q) | HOME="$NEWHOME" gdb src/lyx 2>&1 | strings| tee $GDB
281 # Or use "exited normally":
282 if grep " signal SIG[^T]" $GDB
286 echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
287 if [ ! -z "$TAIL_LINES" ]
290 echo Reproducible > $OUTDIR/Reproducible
293 if [ -z "$REPLAYFILE" ]
295 echo ATTEMPTING TO REPLAY
298 export KEYTEST_INFILE=$KEYCODEpure
299 NUM_KEYCODES=`wc -l < $KEYCODEpure`
300 echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
301 if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
304 LAST_NUM_KEYCODES=$NUM_KEYCODES
305 echo "Hooray! we have eleminated some keycodes"
310 mv $OUTDIR/$SEC.* $BAK/
311 if [ ! -z "$TAIL_LINES" ]
313 echo TTL3 $TAIL_LINES
314 echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
315 TAIL_LINES=$(($TAIL_LINES*2))
316 echo TTL4 $TAIL_LINES
317 if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
319 echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
320 echo Irreproducible > $OUTDIR/Irreproducible
324 echo TTL2 $TAIL_LINES
327 ) 2>&1 |tee $OUTDIR/log