diff --git a/development/keystest/README b/development/keystest/README index 15ee9d44ea..01f1453272 100644 --- a/development/keystest/README +++ b/development/keystest/README @@ -27,12 +27,18 @@ maketar.sh: Makes this tar file :) keytest.py: Sends randomly generated keypresses to the LyX window. killtest: stop the testing stock_text: The stock test to add to each bug report. +watch_keytest.sh: Dumps various info on what keytest is doing, often run as "watch watch_keytest.sh" OUTPUTS: autolyx: Outputs out/*.GDB, a log of all output, including backtraces. keytest.py: Outputs out/*.KEYCODES, a list of all keycodes sent to LyX +TIPS: +To reduce the degree to which keytest writes to your HDD, you may want to run + mount -t tmpfs -o size=50m tmpfs /home/keytest/kt.dir +as root + AUTHOR: Copyright (C) 2009 John McCabe-Dansted, gmatht at gmail dot com. Published under the Gnu General Public Licence, version 2 or later. diff --git a/development/keystest/TODO b/development/keystest/TODO index 3551e6d292..9f24070e97 100644 --- a/development/keystest/TODO +++ b/development/keystest/TODO @@ -1,3 +1,14 @@ +Short Term + +Fix gdb PID bug, use readlink -f lyx/src/lyx +Make WANT_CRASH_ID optional +Force all Titles to start with lyx:: +Start moving out lyx specific stuff +Make variables customisable + +Longer Term + +Move all temporary files to a single dir which can be mounted as a tmpfs to reduce HDD writes HTML out with links. Try to get KEYCODES to be repeatible and useable (DONE) semi protect home dir for repeatibility. @@ -9,4 +20,5 @@ If come across different bug when trying to reproduce another, reproduce *both* Add report as to how easy bug is to reproduce Try e.g. electric fence Automatically update from svn every 24 hours, recheck if bugs have been fixed. -Make it easy to use Xvfb instead of VM. +Make it easy to use Xvfb instead of VM. (Done) +Automatically add bisect to bug report. diff --git a/development/keystest/keytest.py b/development/keystest/keytest.py index 663714d38b..5a4e57ef5e 100755 --- a/development/keystest/keytest.py +++ b/development/keystest/keytest.py @@ -15,6 +15,8 @@ import subprocess print 'Beginning keytest.py' +FNULL = open('/dev/null', 'w') + DELAY = '59' class CommandSource: @@ -103,7 +105,7 @@ class CommandSourceFromFile(CommandSource): drop = random.randint(0, len(self.lines) - 1) del self.lines[drop] - p = p - 1 / len(self.lines) + #p = p - 1 / len(self.lines) origlines = self.lines self.lines = [] for l in origlines: @@ -144,7 +146,8 @@ class CommandSourceFromFile(CommandSource): line = self.lines[self.i] self.count = self.count + 1 self.i = self.i + 1 - print 'Line read: <<' + line + '>>\n' + #print 'Line read: <<' + line + '>>\n' + sys.stdout.write('r') return line.rstrip('\n').rstrip() @@ -171,7 +174,7 @@ def sendKeystring(keystr, LYX_PID): before_secs = time.time() while not lyx_sleeping(): time.sleep(0.02) - print '.', + sys.stdout.write('.') if time.time() - before_secs > 180: print 'Killing due to freeze (KILL_FREEZE)' @@ -188,7 +191,13 @@ def sendKeystring(keystr, LYX_PID): os.system('import -window root '+screenshot_out+str(x.count)+".png") time.sleep(0.1) sys.stdout.flush() - subprocess.call(["xvkbd", "-xsendevent", "-delay", DELAY, "-text", keystr]) + if (subprocess.call( + ["xvkbd", "-xsendevent", "-delay", DELAY, "-text", keystr], + stdout=FNULL,stderr=FNULL + ) == 0): + sys.stdout.write('*') + else: + sys.stdout.write('X') def system_retry(num_retry, cmd): i = 0 @@ -253,7 +262,7 @@ sendKeystring("\Afn", lyx_pid) write_commands = True while True: - os.system('echo -n LOADAVG:; cat /proc/loadavg') + #os.system('echo -n LOADAVG:; cat /proc/loadavg') c = x.getCommand() if c == 'Loop': outfile.close() diff --git a/development/keystest/main.sh b/development/keystest/main.sh index 367d9fd707..b826a0ae47 100755 --- a/development/keystest/main.sh +++ b/development/keystest/main.sh @@ -1,9 +1,19 @@ #PWD=`pwd` +. ./shared_variables.sh if [ "$USER" != keytest ] then echo USER is "$USER", not keytest! Exiting. exit fi + +for file in $ROOT_OUTDIR/to*/*pure +do + if ! cat $file > /dev/null + then + echo cannot read $file, perhaps permissions are wrong? + exit 1 + fi +done #(DISPLAY=:1 sudo -u keytest -H nice -18 ; cd $PWD ; ./autolyx) ./killtest.sh # kill any previous test, so does not interfere ./autolyx diff --git a/development/keystest/report_html.sh b/development/keystest/report_html.sh index 6f9c85bce9..0d3c0f0dcc 100755 --- a/development/keystest/report_html.sh +++ b/development/keystest/report_html.sh @@ -32,10 +32,16 @@ cat $LT/$OUT_NAME/list | sed 's/0x[^ )]*[ )]/.*/g' | sort | uniq | tee $LT/$OUT echo '' >> $OUT/indexreport.html list_keycode_files () { -echo for f in $OUT_NAME/*y/last_crash_sec $OUT_NAME/toreplay/replayed/*y/last_crash_sec -for f in $OUT_NAME/*y/last_crash_sec $OUT_NAME/toreplay/replayed/*y/last_crash_sec $OUT_NAME/toreplay/*y/last_crash_sec $OUT_NAME/toreplay/final/*y/last_crash_sec +#echo for f in $OUT_NAME/*y/last_crash_sec $OUT_NAME/toreplay/replayed/*y/last_crash_sec +for f in $OUT_NAME/*y/last_crash_sec $OUT_NAME/toreplay/replayed/*y/last_crash_sec $OUT_NAME/toreproduce/replayed/*y/last_crash_sec $OUT_NAME/toreplay/*y/last_crash_sec $OUT_NAME/toreplay/final/*y/last_crash_sec +#for f in $OUT_NAME/*y/*y/last_crash_sec $OUT_NAME/toreplay/replayed/*y/*y/last_crash_sec $OUT_NAME/toreplay/*y/*y/last_crash_sec $OUT_NAME/toreplay/final/*y/last_crash_sec do keycode_file=$(echo $f | sed s/last_crash_sec/$(cat $f).KEYCODEpure/) + if test -e $keycode_file.replay/last_crash_sec + then + f=$keycode_file.replay/last_crash_sec + keycode_file=$(echo $f | sed s/last_crash_sec/$(cat $f).KEYCODEpure/) + fi echo $keycode_file done } @@ -134,8 +140,8 @@ do echo cpp $cpp lineno=`echo "$c" | sed 's/.*://g'` echo $cpp,$lineno 1>&2 - #if [ -e "$CPP_HTML_DIR/$cpp.html" ] - if true + if [ -e "$CPP_HTML_DIR/$cpp.html" ] + #if true then #echo "$l" | sed "s/$c/$c<\/a>/" echo "$l" | sed "s?$c?$c<\/a>?" @@ -174,7 +180,7 @@ if ! test -e $ROOT_OUTDIR/html/cpp_html then (mkdir -p $ROOT_OUTDIR/html/cpp_html/ && cd $ROOT_OUTDIR/html/cpp_html/ && - for f in `f ../../../src/ .cpp$` ; do g=`basename $f`; c2html -n < $f > $g.html ; echo $f ; done) + for f in `find ../../../src/ -iname '*.cpp' ; find ../../../src/ -iname '*.h'` ; do g=`basename $f`; c2html -n < $f > $g.html ; echo $f ; done) fi } @@ -215,18 +221,23 @@ do echo f_base $f_base NUM_KEYCODES=`wc -l < "$f_base.KEYCODEpure"` echo NUM_KEYCODES=$NUM_KEYCODES... - if [ "$NUM_KEYCODES" -lt 10 ] + if [ "$NUM_KEYCODES" -lt 20 ] then echo f_base $f_base f=$f_base.GDB echo $f g=$f.short - egrep '([Ii][Nn] .*[:[:alnum:]][:][0-9]*[^0-9]|#0 | signal SIG[^T])' -A9999 <$f >$g + #egrep '([Ii][Nn] .*[:[:alnum:]][:][0-9]*[^0-9]|#0 | signal SIG[^T]| ASSERTION .* VIOLATED IN )' -A9999 <$f >$g + egrep '([Ii][Nn] .*[:[:alnum:]][:][0-9]*[^0-9]|#0 | signal SIG[^T]| ASSERTION .* VIOLATED IN )' -A9999 <$f >$g if true then IN_AT=`egrep -o '([Ii][Nn]|at) ([:lower:]* )?[:_[:alnum:]]*(::[:_[:alnum:]]*|:[0-9]*)' <$f | grep -v lyx_exit | grep -v [Aa]ssert | head -n 1 ` SIGNAL=`grep -o ' signal SIG[[:alnum:]_]*[, ]' <$g | sed s/[^[:upper:]]//g | head -n 1` TITLE="$SIGNAL $IN_AT" + if grep ' ASSERTION .* VIOLATED IN ' $g + then + TITLE=`grep -o ' ASSERTION .* VIOLATED IN .*$' $g` + fi TITLE_=`echo $TITLE|sed s/[^[:alnum:]]/_/g` INDEX="index.html" HTML_NAME=$SEC.html # name of html report for this bug @@ -236,11 +247,13 @@ do echo '' >> $LT/$OUT_NAME/$INDEX (echo -n "
$TITLE " html_keycode - echo " [search] [report] screenshots" - #if ls $f_base.s*.png - #then - # echo "screenshots" - #fi + #echo -n " [search] [report] screenshots" + echo -n " [search] [report]" + if ls $f_base.s*.png > /dev/null + then + echo -n " screenshots" + fi + echo #echo -n '
' echo ) >> $OUT/indexreport.html echo -n '
'>> $LT/$OUT_NAME/$INDEX diff --git a/development/keystest/shared_functions.sh b/development/keystest/shared_functions.sh index d7cd4ba947..ae7f9eab31 100755 --- a/development/keystest/shared_functions.sh +++ b/development/keystest/shared_functions.sh @@ -4,9 +4,6 @@ OUTDIR="$ROOT_OUTDIR" #OUTDIR="$DIRNAME0/out" THIS_PID=$$ -SRC_DIR=lyx/src -EXE_TO_TEST=$SRC_DIR/lyx - #kill(){ # echo kill #} @@ -109,7 +106,7 @@ get_pid () { sleep 3 echo getting pidof "$1" 1>&2 #PID=`ps "-u$USER" "$2" | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'` - PID=`ps x | grep "$1" | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'` + PID=`ps x | grep "$1" | grep -v grep | grep -v "gdb " | sed 's/^ *//g'| sed 's/ .*$//'` echo "$PID" | ( grep " " > /dev/null && ( echo ERROR too many PIDs 1>&2 ; ps x ; full_exit ) ) nPIDs=`echo PID "$PID" | wc -l` echo nPIDs $nPIDs 1>&2 @@ -167,7 +164,7 @@ run_gdb () { bt #shell kill $CHILD_PID shell wmctrl -l - #shell sleep 1 + shell sleep 1 #shell kill -9 $CHILD_PID " ; yes q) | HOME="$NEWHOME" gdb $EXE_TO_TEST 2>&1 | strings| tee $GDB echo "end run_gdb ($KILLER_PID)" @@ -201,7 +198,9 @@ try_replay () { echo This bug appears not to have been reproduced before echo Will try to reproduce now echo - do_replay + echo WANT_CRASH_ID=$WANT_CRASH_ID + WANT_CRASH_ID="$id" do_replay + echo _WANT_CRASH_ID=$WANT_CRASH_ID echo echo Finished attempt at replay else @@ -268,6 +267,11 @@ echo done queued_replays ) } +interesting_crash () { +(grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE) && + ( test -z "$WANT_CRASH_ID" || test "$WANT_CRASH_ID" = `get_crash_id` ) +} + #get_pid() { # ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//' #} @@ -374,7 +378,8 @@ do_one_test() { echo will erase "$NEWHOME" sleep 2 rm -rf $NEWHOME - if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE) + #if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE) + if interesting_crash then extras_save mkdirp $OUTDIR/save && ( diff --git a/development/keystest/shared_variables.sh b/development/keystest/shared_variables.sh index 1fcab84d85..e81e900f06 100644 --- a/development/keystest/shared_variables.sh +++ b/development/keystest/shared_variables.sh @@ -1,3 +1,7 @@ DIRNAME0=`dirname "$0"` -OUT_NAME=out.2 +OUT_NAME=out/3 ROOT_OUTDIR="$DIRNAME0/$OUT_NAME" +SRC_DIR=lyx/src +EXE_TO_TEST=$SRC_DIR/lyx + +EXE_TO_TEST=`readlink -f "$EXE_TO_TEST"` # softlinks can confuse "ps" diff --git a/development/keystest/watch_keytest.sh b/development/keystest/watch_keytest.sh index 9893cf0f0a..939ab74a97 100755 --- a/development/keystest/watch_keytest.sh +++ b/development/keystest/watch_keytest.sh @@ -36,7 +36,9 @@ echo $LATEST_FILE | ( echo $SEC $(($NOW_SEC-$SEC)) ls -l $LATEST_FILE/$SEC.KEYCODEpure | head -n4 echo `cat $LATEST_FILE/$SEC.KEYCODEpure | sed s/KK:\//g` - cat $LATEST_FILE/$SEC.GDB | grep "signal SIG" -A 10 + cat $LATEST_FILE/$SEC.GDB | grep "VIOLATED" #-A 15 -B 5 + cat $LATEST_FILE/$SEC.GDB | grep "signal SIG" #-A 15 -B 5 + cat $LATEST_FILE/$SEC.GDB | grep "lyx::" | head -n5 #-A 15 -B 5 else ls $LATEST_FILE -lot | head cat `echo $LATEST_FILE | sed s/KEYCODEpure.replay/GDB/` | grep "signal SIG" -A 19 @@ -55,7 +57,7 @@ X_PID x-session" $ROOT_OUTDIR/log | grep -v kill | grep -v Terminated | tail -n 9 #exit echo autolyx crashes --------- -grep autolyx: $ROOT_OUTDIR/log | grep -v kill | grep -v Terminated #-A 5 +grep autolyx: $ROOT_OUTDIR/log | grep -v kill | grep -v Terminated | grep -v grep #-A 5 echo python crashes --------- grep -i -a Trace $ROOT_OUTDIR/log -A 7 | tail -n8 #echo misc ----