]> git.lyx.org Git - lyx.git/blob - development/keystest/autolyx
server_monitor.h must be included last for msvc sake.
[lyx.git] / development / keystest / autolyx
1 #!/bin/bash
2 # This script starts LyX, and restarts LyX if it is closed
3 # it logs all output, including backtraces to development/keystest/out/GDB
4
5 #Setting the following may give better screen shots
6 #gconftool-2 /apps/metacity/general/compositing_manager -s -t bool true
7
8 DIRNAME0=`dirname "$0"`
9 OUTDIR="$DIRNAME0/out"
10 ROOT_OUTDIR="$DIRNAME0/out"
11 THIS_PID=$$
12
13
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
15
16 #############################
17 # This section of code is LyX Specific
18 #############################
19
20 if [ ! -e lib/doc.orig ]
21 then
22         mv lib/doc lib/doc.orig
23 fi
24
25 ensure_cannot_print () {
26 lpq && ( 
27         echo We can print, this is bad!
28         echo use lpadmin to stop keytest from destroying a forest.
29         full_exit
30         sleep 999999 ; read
31 )
32 }
33
34 extras_save () {
35  for f in `ls lib/doc`
36  do
37         if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
38         then 
39                 echo making doc dir $OUTDIR/$SEC.doc
40                 mkdir -p $OUTDIR/$SEC.doc
41                 cp -a lib/doc/$f $OUTDIR/$SEC.doc/
42         fi
43  done
44 }
45
46 extras_prepare () {
47         mkdir -p lib/doc/
48         rm lib/doc/*.lyx
49         cp -p lib/doc.orig/*.lyx lib/doc/
50 }
51
52 get_crash_id () {
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'
55 }
56
57 calc_confirm_file() {
58         id=`get_crash_id`
59         echo "$ROOT_OUTDIR/$id.reproduced"
60 }
61
62 full_exit() {
63         echo attempting to exit this entire script... normal exit may just exit one function
64
65         kill $THIS_PID
66         sleep 1
67         echo We should not get this far
68         sleep 1
69         kill -9 $THIS_PIS
70         echo We really should not get this far
71         exit
72 }
73
74 ###########################
75
76 get_pid () {
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" ]
82         then 
83                 echo autolyx: Wrong number of PIDs "$nPIDs" 1>&2
84         fi
85         echo "$PID"
86 }
87
88 try_replay () {
89         id=`get_crash_id`
90         echo CRASH_ID 
91         export CONFIRM_FILE=`calc_confirm_file`
92         if [ ! -e "$CONFIRM_FILE" ]
93         then
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
97                 echo
98                 do_replay
99                 echo 
100                 echo Finished attempt at replay
101         else
102                 echo $CONFIRM_FILE exists
103                 echo This bugs has already been reproduced
104                 echo Will not attempt to reproduce again
105         fi
106 }
107
108 do_replay() {
109         (REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
110         TEST_PID="$!"
111         echo Backgrounded $TEST_PID
112         echo waiting for $TEST_PID to finish
113         wait "$TEST_PID" 
114 }
115
116 do_queued_replays() {
117 for f in `ls development/keytest/out/toreplay/*KEYCODEpure`
118 do
119         if [ ! -e "$f.replay/last_crash_sec" ]
120         then
121                 #./development/keytest/killtest
122                 killall lyx
123                 sleep 1
124                 killall -9 lyx
125                 KEYCODEpure="$f" do_replay
126         fi
127 done
128 }
129
130
131 if [ ! -z "$REPLAYFILE" ]
132 then
133         echo REPLAYMODE
134         OUTDIR="$REPLAYFILE.replay/"
135         mkdir -p $REPLAYFILE.replay/ || full_exit
136         export KEYTEST_INFILE=$REPLAYFILE
137         if [ ! -e "$REPLAYFILE" ]
138         then
139                 echo "$REPLAYFILE" does not exist
140                 echo exiting
141                 full_exit 1
142         fi
143 else
144         do_queued_replays
145         echo RANDOM MODE
146 fi
147
148 get_pid [0-9].x-session-manager"$" x
149 export X_PID=`get_pid [0-9].x-session-manager x`
150 echo X_PID $X_PID
151
152 export TAIL_LINES=$TAIL_LINES
153 echo TL $TAIL_LINES
154         
155
156 BAK="$OUTDIR/backup"
157 mkdir -p $BAK
158
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
165 (
166 echo TTL $TAIL_LINES
167
168 LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
169
170 ensure_cannot_print
171 echo X_PID $X_PID
172 export X_PID=`get_pid [0-9].x-session-manager"$" x`
173 echo PATH $PATH
174 while true
175 do
176  echo Currently running autolyx PID=$$
177  if [ ! -z "$TAIL_LINES" ] 
178  then
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
183   MAX_DROP=0
184  else
185   MAX_DROP=0.2
186  fi
187  export MAX_DROP
188   SEC=`date +%s`
189  if [ ! -z "$REPLAYFILE" ] 
190  then
191         echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
192         if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
193         then
194                 echo
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
198                 echo Giving up now.
199                 echo
200                 echo $LAST_CRASH_SEC > $OUTDIR/Finished
201                 mkdir $OUTDIR/final
202                 ln $OUTDIR/$SEC* $OUTDIR/final
203                 CONFIRM_FILE=`calc_confirm_file`
204                 echo Reproducible > "$CONFIRM_FILE"
205                 
206                 
207                 full_exit
208         fi
209  fi
210
211   GDB=$OUTDIR/$SEC.GDB
212   KEYCODE=$OUTDIR/$SEC.KEYCODE
213   KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
214   NEWHOME=~/kt.dir/$SEC.dir
215   mkdir -p $NEWHOME
216   NEWHOME=`cd $NEWHOME; pwd`
217   echo NEWHOME $NEWHOME
218   mkdir -p "$NEWHOME"
219   cp -rv ~/.lyx "$NEWHOME"/
220   killall -9 lyx
221   ( sleep 25 &&
222      ps a | grep lyx 
223         echo -- 1
224      LYX_PID=""
225      i=0
226      while [ -z "$LYX_PID" -a 200 -gt $i ]
227      do
228              export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'|  sed 's/ .*$//'`
229              echo LYXPID "$LYX_PID"
230              sleep 0.1
231              i=$(($i+1))
232      done 
233      echo `ps a | grep /src/lyx`
234         echo -- 2
235      echo `ps a | grep /src/lyx | grep -v grep`
236         echo -- 3
237      echo `ps a | grep /src/lyx | grep -v grep | sed 's/ [a-z].*$//'`
238         echo -- 4
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
243
244      if [ ! -z "$LYX_PID" ]
245      then
246          kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
247          sleep 0.2
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
250      fi
251      killall lyx) &
252   CHILD_PID="$!"
253   ls src/lyx ; sleep 1
254    pwd
255   
256   #You may want to use the following to simulate SIGFPE
257   #(sleep 90 && killall -8 lyx) &
258   echo TTL $TAIL_LINES
259   extras_prepare
260   ensure_cannot_print
261   echo Starting GDB
262   (echo "
263   shell svn info src/
264   run
265   bt
266   shell kill $CHILD_PID
267   shell import -window root '$GDB.png'
268   shell wmctrl -l
269   shell sleep 1
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
274   shell wmctrl -R lyx 
275   shell import -window root '$GDB..png'
276  " ; yes q) | HOME="$NEWHOME" gdb src/lyx 2>&1 | strings|  tee $GDB
277   echo END gdb
278   kill $CHILD_PID
279   sleep 0.3
280   kill -9 $CHILD_PID
281   # Or use "exited normally":
282   if grep " signal SIG[^T]" $GDB 
283   then
284     extras_save
285     LAST_CRASH_SEC=$SEC
286     echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
287     if [ ! -z "$TAIL_LINES" ]
288     then
289         LAST_EVENT="$SEC"
290         echo Reproducible > $OUTDIR/Reproducible
291     fi
292     TAIL_LINES="" 
293     if [ -z "$REPLAYFILE" ]
294     then
295         echo ATTEMPTING TO REPLAY
296         try_replay
297     else
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" ]
302         then
303                 LAST_EVENT="$SEC"
304                 LAST_NUM_KEYCODES=$NUM_KEYCODES
305                 echo "Hooray! we have eleminated some keycodes"
306         fi
307     fi
308   else
309     rm -r $BAK/* 
310     mv $OUTDIR/$SEC.* $BAK/
311     if [ ! -z "$TAIL_LINES" ]
312      then
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" ]
318         then
319                 echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
320                 echo Irreproducible > $OUTDIR/Irreproducible
321                 full_exit
322         fi
323     fi
324     echo TTL2 $TAIL_LINES
325   fi
326 done
327 ) 2>&1 |tee $OUTDIR/log