mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-25 02:49:46 +00:00
New keytest version from John McCabe-Dansted
http://www.mail-archive.com/lyx-devel@lists.lyx.org/msg156659.html git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@32740 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
9e5a12b905
commit
81dea0164c
@ -3,40 +3,35 @@
|
||||
This is a program to spam LyX with millions of randomly generated key
|
||||
presses, and collect the crash results.
|
||||
|
||||
Since the code involves spamming random keypresses, I'd recommend
|
||||
running it in a VM, well away from your main X windows session.
|
||||
Since the code involves spamming random keypresses, I run it under a special
|
||||
user "keytest", well away from my main X windows session.
|
||||
|
||||
In short, to use this, run development/keytest/lyx_make.sh
|
||||
To use this software, first configure it by editing the
|
||||
configuration parameters in shared_functions.sh and shared_variables.sh
|
||||
then run the following:
|
||||
|
||||
It requires the following packages to run
|
||||
xvkbd wmctrl
|
||||
the following are also useful:
|
||||
lyx libqt4-dbg subversion automake
|
||||
./setup.sh # add keytest user and apt-get required files
|
||||
sudo -H -u keytest -e xterm # Create a xterm for running keytest in
|
||||
. ./initXvfb # sets up a fake X server for keytest to play in
|
||||
./main.sh
|
||||
|
||||
It is run by running ./autolyx in one xterm, and ./test.py in another.
|
||||
I wrote lyx_make.sh as a easy way of updating lyx and running these two
|
||||
programs together.
|
||||
Note that this bug finding software is itself quite buggy.
|
||||
|
||||
CONTENTS:
|
||||
|
||||
README: this readme file
|
||||
report.sh: A quick way of generating bug reports and an overview from the logs.
|
||||
report_html.sh: A quick way of generating bug reports and an overview from the logs.
|
||||
make_screen_shots.sh: a script for making screenshots, if they are missing from output of above.
|
||||
autolyx: A script to continually restart lyx and collect the bug reports
|
||||
lyx_make.sh: should updates, compiles, and everything needed to generated logs.
|
||||
maketar.sh: Makes this tar file :)
|
||||
test.py: Sends LT100 randomly generated keypresses per second to the LyX window.
|
||||
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.
|
||||
|
||||
OUTPUTS:
|
||||
|
||||
autolyx: Outputs out/GDB, a log of all output, including backtraces.
|
||||
test.py: Outputs out/KEYCODES, a list of all keycodes sent to LyX
|
||||
|
||||
reports.sh: Outputs
|
||||
out/overview: an overview of all the frequency of each error
|
||||
out/overview_sort: as above but sorted
|
||||
out/report_*: A collection of autogenerated bug reports.
|
||||
autolyx: Outputs out/*.GDB, a log of all output, including backtraces.
|
||||
keytest.py: Outputs out/*.KEYCODES, a list of all keycodes sent to LyX
|
||||
|
||||
AUTHOR:
|
||||
Copyright (C) 2009 John McCabe-Dansted, gmatht at gmail dot com.
|
||||
|
7
development/keystest/add_write_perms.sh
Executable file
7
development/keystest/add_write_perms.sh
Executable file
@ -0,0 +1,7 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# This command makes all files in "$ROOT_OUTDIR" writable by keytest.
|
||||
#
|
||||
# This command is useful if you run keytest under a seperate user "keytest" of group "keytest"
|
||||
. ./shared_variables.sh
|
||||
find $ROOT_OUTDIR | while read f ; do chmod g+rw $f ; chgrp keytest $f ;done
|
@ -1,495 +1,5 @@
|
||||
#!/bin/bash
|
||||
# This script starts LyX, and restarts LyX if it is closed
|
||||
# it logs all output, including backtraces to development/keystest/out/GDB
|
||||
|
||||
#Setting the following may give better screen shots
|
||||
#gconftool-2 /apps/metacity/general/compositing_manager -s -t bool true
|
||||
|
||||
DIRNAME0=`dirname "$0"`
|
||||
OUTDIR="$DIRNAME0/out"
|
||||
ROOT_OUTDIR="$DIRNAME0/out"
|
||||
THIS_PID=$$
|
||||
|
||||
EXE_TO_TEST=src/lyx
|
||||
|
||||
if [ ! -e "$EXE_TO_TEST" ]
|
||||
then
|
||||
echo "$EXE_TO_TEST" does not exist
|
||||
echo Cannot proceed
|
||||
exit
|
||||
fi
|
||||
|
||||
#BORED_AFTER_SECS=7200 #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
|
||||
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
|
||||
|
||||
LAST_CORE=""
|
||||
|
||||
#############################
|
||||
# This section of code is LyX Specific
|
||||
#############################
|
||||
|
||||
if [ ! -e $DIRNAME0/.lyx ]
|
||||
then
|
||||
echo WARNING $DIRNAME0/.lyx does not exist
|
||||
echo will need to regenerate .lyx every test
|
||||
fi
|
||||
|
||||
#if [ ! -e lib/doc.orig ]
|
||||
#then
|
||||
# mv lib/doc lib/doc.orig
|
||||
#fi
|
||||
|
||||
kill_all_children() {
|
||||
kill `list_all_children.sh $1`
|
||||
sleep 0.1
|
||||
kill -9 `list_all_children.sh $1`
|
||||
}
|
||||
|
||||
|
||||
|
||||
ensure_cannot_print () {
|
||||
if [ ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
return
|
||||
fi
|
||||
if lpq
|
||||
then
|
||||
|
||||
echo We can print, this is bad!
|
||||
echo use lpadmin to stop keytest from destroying a forest.
|
||||
full_exit
|
||||
sleep 999999 ; read
|
||||
else
|
||||
echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!"
|
||||
fi
|
||||
}
|
||||
|
||||
extras_save () {
|
||||
return
|
||||
for f in `ls lib/doc`
|
||||
do
|
||||
if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
|
||||
then
|
||||
#echo making doc dir $OUTDIR/$SEC.doc
|
||||
mkdir -p $OUTDIR/$SEC.doc
|
||||
cp -a lib/doc/$f $OUTDIR/$SEC.doc/
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
extras_prepare () {
|
||||
return
|
||||
mkdir -p lib/doc/
|
||||
rm lib/doc/*.lyx
|
||||
cp -p lib/doc.orig/*.lyx lib/doc/
|
||||
}
|
||||
|
||||
get_crash_id () {
|
||||
name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
|
||||
echo $name | sed 's/ /__/g'
|
||||
}
|
||||
|
||||
calc_confirm_file() {
|
||||
id=`get_crash_id`
|
||||
echo "$ROOT_OUTDIR/$id.reproduced"
|
||||
}
|
||||
|
||||
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/ .*$//'`
|
||||
echo "$PID" | ( grep " " > /dev/null && ( echo too many PIDs 1>&2 ; full_exit ) )
|
||||
nPIDs=`echo PID "$PID" | wc -l`
|
||||
echo nPIDs $nPIDs 1>&2
|
||||
sleep 1
|
||||
echo -- if [ "$nPIDs" != "1" ] 1>&2
|
||||
if test "$nPIDs" != "1" #2> /tmp/testerr
|
||||
then
|
||||
echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2
|
||||
fi
|
||||
echo "$PID"
|
||||
echo got pidof "$1" 1>&2
|
||||
}
|
||||
clean_up () {
|
||||
KT_PID=`get_pid keytest.py x`
|
||||
kill $KT_PID
|
||||
sleep 0.1
|
||||
kill -9 $KT_PID
|
||||
}
|
||||
|
||||
full_exit() {
|
||||
clean_up
|
||||
|
||||
echo attempting to exit this entire script... normal exit may just exit one function
|
||||
|
||||
kill $THIS_PID
|
||||
sleep 1
|
||||
echo We should not get this far
|
||||
sleep 1
|
||||
kill -9 $THIS_PID
|
||||
echo We really should not get this far
|
||||
exit
|
||||
}
|
||||
|
||||
run_gdb () {
|
||||
echo Starting GDB
|
||||
(echo "
|
||||
shell svn info src/
|
||||
run
|
||||
bt
|
||||
shell kill $CHILD_PID
|
||||
shell wmctrl -l
|
||||
shell sleep 1
|
||||
shell kill -9 $CHILD_PID
|
||||
" ; yes q) | HOME="$NEWHOME" gdb src/lyx 2>&1 | strings| tee $GDB
|
||||
echo "end run_gdb"
|
||||
#### gcore $GDB.core
|
||||
#shell wmctrl -r __renamed__ -b add,shaded
|
||||
#shell wmctrl -r term -b add,shaded
|
||||
#shell wmctrl -r term -b add,shaded
|
||||
#shell wmctrl -R lyx'
|
||||
#
|
||||
#shell import -window root '$GDB.png'
|
||||
#shell import -window root '$GDB..png'
|
||||
#exit
|
||||
}
|
||||
|
||||
|
||||
###########################
|
||||
|
||||
|
||||
|
||||
try_replay () {
|
||||
id=`get_crash_id`
|
||||
echo CRASH_ID
|
||||
export CONFIRM_FILE=`calc_confirm_file`
|
||||
if [ ! -e "$CONFIRM_FILE" ]
|
||||
then
|
||||
echo $CONFIRM_FILE does not exist
|
||||
echo This bug appears not to have been reproduced before
|
||||
echo Will try to reproduce now
|
||||
echo
|
||||
do_replay
|
||||
echo
|
||||
echo Finished attempt at replay
|
||||
else
|
||||
echo $CONFIRM_FILE exists
|
||||
echo This bugs has already been reproduced
|
||||
echo Will not attempt to reproduce again
|
||||
fi
|
||||
}
|
||||
|
||||
do_replay() {
|
||||
(REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
|
||||
TEST_PID="$!"
|
||||
echo Backgrounded $TEST_PID
|
||||
echo waiting for $TEST_PID to finish
|
||||
wait "$TEST_PID"
|
||||
}
|
||||
|
||||
test_replayed () {
|
||||
test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible"
|
||||
}
|
||||
|
||||
move_to_replayed () {
|
||||
mkdir -p $REPLAY_DIR/replayed
|
||||
mv $f* $REPLAY_DIR/replayed
|
||||
}
|
||||
|
||||
do_queued_replays() {
|
||||
REPLAY_DIR=development/keytest/out/toreplay
|
||||
for f in `ls $REPLAY_DIR/*KEYCODEpure`
|
||||
do
|
||||
if test_replayed
|
||||
then
|
||||
move_to_replayed
|
||||
else
|
||||
#./development/keytest/killtest
|
||||
killall lyx
|
||||
sleep 1
|
||||
killall -9 lyx
|
||||
KEYCODEpure="$f" do_replay
|
||||
#if test_replayed
|
||||
#then
|
||||
move_to_replayed
|
||||
#fi
|
||||
fi
|
||||
|
||||
done
|
||||
}
|
||||
|
||||
#get_pid() {
|
||||
# ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'
|
||||
#}
|
||||
|
||||
do_one_test() {
|
||||
GDB=$OUTDIR/$SEC.GDB
|
||||
KEYCODE=$OUTDIR/$SEC.KEYCODE
|
||||
KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
|
||||
NEWHOME=~/kt.dir/$SEC.dir
|
||||
mkdir -p $NEWHOME
|
||||
NEWHOME=`cd $NEWHOME; pwd`
|
||||
echo NEWHOME $NEWHOME
|
||||
mkdir -p "$NEWHOME"
|
||||
cp -rv $DIRNAME0/.lyx "$NEWHOME"/
|
||||
killall -9 lyx latex pdflatex
|
||||
( sleep 9 &&
|
||||
ps a | grep lyx
|
||||
echo -- 1 || full_exit
|
||||
LYX_PID=""
|
||||
i=0
|
||||
echo -- while [ -z "$LYX_PID" -a 200 -gt $i ]
|
||||
while [ -z "$LYX_PID" -a 200 -gt $i ]
|
||||
do
|
||||
#export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
|
||||
export LYX_PID=`get_pid "/src/lyx$" `
|
||||
echo LYXPID "$LYX_PID" || full_exit
|
||||
sleep 0.1
|
||||
i=$(($i+1))
|
||||
done
|
||||
echo `ps a | grep /src/lyx`
|
||||
echo -- 2
|
||||
echo `ps a | grep /src/lyx | grep -v grep`
|
||||
echo -- 3
|
||||
echo `ps a | grep /src/lyx | grep -v grep | sed 's/ [a-z].*$//'`
|
||||
echo -- 4
|
||||
echo LYX_PID=$LYX_PID
|
||||
echo XA_PRIMARY | xclip -selection XA_PRIMARY
|
||||
echo XA_SECONDARY | xclip -selection XA_SECONDARY
|
||||
echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
|
||||
|
||||
echo -- if [ ! -z "$LYX_PID" ]
|
||||
if [ ! -z "$LYX_PID" ]
|
||||
then
|
||||
kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
|
||||
sleep 0.2
|
||||
kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
|
||||
while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz
|
||||
do
|
||||
echo trying to maximize lyx
|
||||
sleep 1
|
||||
done
|
||||
KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
|
||||
#echo "$!" > $NEWHOME/keytest_py.pid
|
||||
fi
|
||||
killall lyx) &
|
||||
CHILD_PID="$!"
|
||||
ls src/lyx ; sleep 1
|
||||
pwd
|
||||
|
||||
#You may want to use the following to simulate SIGFPE
|
||||
#(sleep 90 && killall -8 lyx) &
|
||||
echo TTL $TAIL_LINES
|
||||
extras_prepare
|
||||
ensure_cannot_print
|
||||
run_gdb
|
||||
# (run_gdb) &
|
||||
# GDBTASK_PID="$!"
|
||||
# (sleep 600 ; kill "$!")
|
||||
# echo WAITING FOR: wait $GDBTASK_PID
|
||||
# wait $GDBTASK_PID
|
||||
# echo NOLONGER waiting for: wait $GDBTASK_PID
|
||||
|
||||
echo END gdb
|
||||
kill $CHILD_PID
|
||||
KT_PID=`get_pid keytest.py`
|
||||
echo KT_PID=$KT_PID
|
||||
kill $KT_PID
|
||||
sleep 0.3
|
||||
kill -9 $CHILD_PID
|
||||
kill -9 $KT_PID
|
||||
# Or use "exited normally":
|
||||
echo END gdb2
|
||||
# these tend to take up a huge amount of space:
|
||||
rm -rf $NEWHOME
|
||||
if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE)
|
||||
then
|
||||
extras_save
|
||||
mkdir -p $OUTDIR/save && (
|
||||
ln $OUTDIR/$SEC.* $OUTDIR/save ||
|
||||
cp $OUTDIR/$SEC.* $OUTDIR/save)
|
||||
LAST_CRASH_SEC=$SEC
|
||||
echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
LAST_EVENT="$SEC"
|
||||
echo Reproducible > $OUTDIR/Reproducible
|
||||
fi
|
||||
TAIL_LINES=""
|
||||
if [ -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo ATTEMPTING TO REPLAY
|
||||
try_replay
|
||||
else
|
||||
export KEYTEST_INFILE=$KEYCODEpure
|
||||
NUM_KEYCODES=`wc -l < $KEYCODEpure`
|
||||
echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
|
||||
if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
|
||||
then
|
||||
LAST_EVENT="$SEC"
|
||||
LAST_NUM_KEYCODES=$NUM_KEYCODES
|
||||
echo "Hooray! we have eleminated some keycodes"
|
||||
fi
|
||||
fi
|
||||
if [ ! -z "$AND_THEN_QUIT" ]
|
||||
then
|
||||
RESULT=1
|
||||
echo RR 1
|
||||
return 1
|
||||
fi
|
||||
if [ ! -z "$LAST_CORE" ]
|
||||
then
|
||||
rm "$LAST_CORE"
|
||||
fi
|
||||
LAST_CORE="$GDB.core"
|
||||
else
|
||||
rm -rf $BAK/*
|
||||
mv $OUTDIR/$SEC.* $BAK/
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
echo TTL3 $TAIL_LINES
|
||||
echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
|
||||
TAIL_LINES=$(($TAIL_LINES*2))
|
||||
echo TTL4 $TAIL_LINES
|
||||
if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
|
||||
then
|
||||
echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
|
||||
echo Irreproducible > $OUTDIR/Irreproducible
|
||||
full_exit
|
||||
fi
|
||||
fi
|
||||
if [ ! -z "$AND_THEN_QUIT" ]
|
||||
then
|
||||
RESULT=0
|
||||
echo RR 0
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo TTL2 $TAIL_LINES
|
||||
fi
|
||||
}
|
||||
|
||||
if [ ! -z "$1" ]
|
||||
then
|
||||
REPLAYFILE=$1
|
||||
fi
|
||||
|
||||
if [ ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo REPLAYMODE
|
||||
OUTDIR="$REPLAYFILE.replay/"
|
||||
mkdir -p $REPLAYFILE.replay/ || full_exit
|
||||
export KEYTEST_INFILE=$REPLAYFILE
|
||||
if [ ! -e "$REPLAYFILE" ]
|
||||
then
|
||||
echo "$REPLAYFILE" does not exist
|
||||
echo exiting
|
||||
full_exit 1
|
||||
fi
|
||||
else
|
||||
do_queued_replays
|
||||
echo RANDOM MODE
|
||||
fi
|
||||
|
||||
get_pid [0-9].x-session-manager"$" x
|
||||
export X_PID=`get_pid [0-9].x-session-manager x`
|
||||
echo X_PID $X_PID
|
||||
|
||||
export TAIL_LINES=$TAIL_LINES
|
||||
echo TL $TAIL_LINES
|
||||
|
||||
|
||||
BAK="$OUTDIR/backup"
|
||||
mkdir -p $BAK
|
||||
|
||||
|
||||
|
||||
|
||||
#rename other windows to avoid confusion.
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
export PATH=`cd $DIRNAME0; pwd`/path:$PATH
|
||||
|
||||
if [ ! -z "$1" ]
|
||||
then
|
||||
SEC=`date +%s`
|
||||
export MAX_DROP=0
|
||||
if [ ".$SCREENSHOT_OUT." = ".auto." ]
|
||||
then
|
||||
echo SCREENSHOT_OUT was $SCREENSHOT_OUT.
|
||||
export SCREENSHOT_OUT="$OUTDIR/$SEC.s"
|
||||
echo SCREENSHOT_OUT is $SCREENSHOT_OUT.
|
||||
#exit
|
||||
fi
|
||||
export RESULT=179
|
||||
do_one_test #| tee do_one_test.log
|
||||
RESULT="$?"
|
||||
echo Ressult $RESULT
|
||||
|
||||
kill `list_all_children.sh $$`
|
||||
sleep 0.1
|
||||
kill -9 `list_all_children.sh $$`
|
||||
|
||||
exit $RESULT
|
||||
|
||||
#echo done ; sleep 1
|
||||
full_exit
|
||||
fi
|
||||
|
||||
|
||||
|
||||
(
|
||||
echo TTL $TAIL_LINES
|
||||
|
||||
LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
|
||||
|
||||
ensure_cannot_print
|
||||
echo X_PID $X_PID
|
||||
export X_PID=`get_pid [0-9].x-session-manager"$" x`
|
||||
echo PATH $PATH
|
||||
while true
|
||||
do
|
||||
echo Currently running autolyx PID=$$
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
echo TAIL_LINES: "$TAIL_LINES"
|
||||
TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
|
||||
tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
|
||||
KEYTEST_INFILE=$TAIL_FILE
|
||||
MAX_DROP=0
|
||||
else
|
||||
MAX_DROP=0.2
|
||||
fi
|
||||
export MAX_DROP
|
||||
SEC=`date +%s`
|
||||
if [ ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
|
||||
if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
|
||||
then
|
||||
echo
|
||||
echo Is is now $SEC seconds
|
||||
echo The last time we managed to eliminate a keycode was at $LAST_EVENT
|
||||
echo We get bored after $BORED_AFTER_SECS seconds
|
||||
echo Giving up now.
|
||||
echo
|
||||
echo $LAST_CRASH_SEC > $OUTDIR/Finished
|
||||
mkdir $OUTDIR/final
|
||||
ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final
|
||||
CONFIRM_FILE=`calc_confirm_file`
|
||||
echo Reproducible > "$CONFIRM_FILE"
|
||||
|
||||
|
||||
full_exit
|
||||
fi
|
||||
else
|
||||
do_queued_replays
|
||||
fi
|
||||
do_one_test
|
||||
done
|
||||
kill_all_children $$
|
||||
) 2>&1 |tee $OUTDIR/log
|
||||
kill_all_children $$
|
||||
. $DIRNAME0/shared_variables.sh
|
||||
. $DIRNAME0/shared_functions.sh
|
||||
autolyx_main "$@"
|
||||
|
@ -1,5 +1,8 @@
|
||||
#!/bin/bash
|
||||
KT=`dirname $0`
|
||||
KT=`dirname "$0"`
|
||||
|
||||
. "$KT/shared_functions.sh"
|
||||
|
||||
N=$1
|
||||
shift
|
||||
|
||||
@ -13,8 +16,11 @@ do
|
||||
if ! "$@"
|
||||
then
|
||||
echo TRIES_REQUIRED: $i
|
||||
kill_all_children $$
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
||||
kill_all_children $$
|
||||
echo DONE $N TIMES
|
||||
|
||||
|
26
development/keystest/initXvfb
Executable file
26
development/keystest/initXvfb
Executable file
@ -0,0 +1,26 @@
|
||||
if [ -z "$1" ]
|
||||
then
|
||||
d=1
|
||||
else
|
||||
d=$1
|
||||
fi
|
||||
|
||||
#Xvfb :1 -screen 1 800x600x24 -fbdir /tmp &
|
||||
#Xvfb :1 -screen 1 800x600x24 -pixdepths "1 8 16 24 32" &
|
||||
#Xvfb :$d -ac -screen 0 800x600x24 -wr
|
||||
echo 1
|
||||
Xvfb :$d -ac -screen 0 800x600x24 -wr &
|
||||
|
||||
echo 2
|
||||
export DISPLAY=:$d
|
||||
echo 3
|
||||
icewm&
|
||||
echo 4
|
||||
#metacity&
|
||||
echo 5
|
||||
while true
|
||||
do
|
||||
sleep 300
|
||||
icewm &
|
||||
done &
|
||||
echo 6
|
@ -137,6 +137,8 @@ class CommandSourceFromFile(CommandSource):
|
||||
os._exit(0)
|
||||
if self.i >= len(self.lines):
|
||||
self.loops = self.loops + 1
|
||||
if self.loops > 3:
|
||||
os._exit(0)
|
||||
self.i = 0
|
||||
return 'Loop'
|
||||
line = self.lines[self.i]
|
||||
@ -181,18 +183,31 @@ def sendKeystring(keystr, LYX_PID):
|
||||
while not lyx_sleeping():
|
||||
time.sleep(0.02)
|
||||
print '.',
|
||||
print 'Making Screenshot: ' + screenshot_out
|
||||
print 'Making Screenshot: ' + screenshot_out + ' OF ' + infilename
|
||||
time.sleep(0.2)
|
||||
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])
|
||||
|
||||
def system_retry(num_retry, cmd):
|
||||
i = 0
|
||||
rtn = os.system(cmd)
|
||||
while ( ( i < num_retry ) and ( rtn != 0) ):
|
||||
i = i + 1
|
||||
rtn=os.system(cmd)
|
||||
time.sleep(1)
|
||||
if ( rtn != 0 ):
|
||||
print "Command Failed: "+cmd
|
||||
print " EXITING!\n"
|
||||
os._exit(1)
|
||||
|
||||
def RaiseWindow():
|
||||
os.system("echo x-session-manager PID: $X_PID.")
|
||||
os.system("echo x-session-manager open files: `lsof -p $X_PID | grep ICE-unix | wc -l`")
|
||||
os.system("wmctrl -l | ( grep '"+lyx_window_name+"' || ( killall lyx ; sleep 1 ; killall -9 lyx ))")
|
||||
os.system("wmctrl -R '"+lyx_window_name+"' ;sleep 0.1")
|
||||
####os.system("wmctrl -l | ( grep '"+lyx_window_name+"' || ( killall lyx ; sleep 1 ; killall -9 lyx ))")
|
||||
#os.system("wmctrl -R '"+lyx_window_name+"' ;sleep 0.1")
|
||||
system_retry(30, "wmctrl -R '"+lyx_window_name+"'")
|
||||
|
||||
|
||||
lyx_pid = os.environ.get('LYX_PID')
|
||||
@ -253,7 +268,7 @@ while True:
|
||||
if os.path.exists('/proc/' + lyx_pid + '/status'):
|
||||
sendKeystring(c[4:], lyx_pid)
|
||||
else:
|
||||
os.system('killall lyx; sleep 2 ; killall -9 lyx')
|
||||
##os.system('killall lyx; sleep 2 ; killall -9 lyx')
|
||||
print 'No path /proc/' + lyx_pid + '/status, exiting'
|
||||
os._exit(1)
|
||||
elif c[0:4] == 'KD: ':
|
||||
|
@ -18,7 +18,7 @@ kill_all_children () {
|
||||
kill -9 `listall "$*"`
|
||||
}
|
||||
|
||||
if [ "$1"="$kill" ]
|
||||
if [ "$1" = "kill" ]
|
||||
then
|
||||
shift
|
||||
kill_all_children "$*"
|
||||
|
9
development/keystest/main.sh
Executable file
9
development/keystest/main.sh
Executable file
@ -0,0 +1,9 @@
|
||||
#PWD=`pwd`
|
||||
if [ "$USER" != keytest ]
|
||||
then
|
||||
echo USER is "$USER", not keytest! Exiting.
|
||||
exit
|
||||
fi
|
||||
#(DISPLAY=:1 sudo -u keytest -H nice -18 ; cd $PWD ; ./autolyx)
|
||||
./killtest.sh # kill any previous test, so does not interfere
|
||||
./autolyx
|
13
development/keystest/make_screen_shots.sh
Executable file
13
development/keystest/make_screen_shots.sh
Executable file
@ -0,0 +1,13 @@
|
||||
. ./shared_variables.sh
|
||||
OUT=$ROOT_OUTDIR
|
||||
for f in `ls $OUT/*/final/*pure`
|
||||
do
|
||||
echo file_ $f
|
||||
if [ ! -e $f.replay ]
|
||||
then
|
||||
echo replaying $f for screenshot
|
||||
#(SCREENSHOT_OUT="auto" ./doNtimes.sh 3 ./reproduce.sh $f ; echo $f ; ./list_all_children.sh kill $$ ) 2>&1 | tee $f.screenshot-log
|
||||
(SCREENSHOT_OUT="auto" ./doNtimes.sh 9 ./reproduce.sh $f ; echo $f ) 2>&1 | tee $f.screenshot-log
|
||||
echo replayed $f for screenshot
|
||||
fi
|
||||
done
|
@ -1,31 +1,45 @@
|
||||
#!/bin/bash
|
||||
#LT=development/keystest
|
||||
LT=`dirname $0`
|
||||
. $LT/shared_variables.sh
|
||||
|
||||
GEOM=320x200
|
||||
QUALITY=85
|
||||
if [ -z "$KEYCODE_DIR" ]
|
||||
then
|
||||
KEYCODE_DIR=out
|
||||
KEYCODE_DIR=$ROOT_OUTDIR
|
||||
fi
|
||||
#convert -normalize -scale $GEOM -quality $QUALITY $f $GEOM/$f
|
||||
|
||||
UNIQUE_LINE=1
|
||||
|
||||
OUT=$LT/out/html4
|
||||
OUT=$LT/$OUT_NAME/html
|
||||
URL_OF_OUT=http://gmatht.homelinux.net/xp/$OUT_NAME/html/
|
||||
mkdir -p $OUT
|
||||
rm $OUT/index*.html
|
||||
ls $OUT/*.html
|
||||
|
||||
CPP_HTML_DIR_REL=cpp_html
|
||||
CPP_HTML_DIR=$out/cpp_html
|
||||
CPP_HTML_DIR=$OUT/cpp_html
|
||||
|
||||
strings $LT/out/GDB.* > $LT/out/GDBs
|
||||
grep "#$UNIQUE_LINE " $LT/out/GDBs > $LT/out/list
|
||||
cat $LT/out/list | sed 's/0x[^ )]*[ )]/.*/g' | sort | uniq | tee $LT/out/listuniq
|
||||
LYX_VER=`src/lyx -version 2>&1 | head -n1 | sed s/^LyX\ // | sed s/\ .*// | sed s/1svn/0/ | sed s/2svn/1/ | sed s/3svn/2/ | sed s/4svn/3/ | sed s/5svn/4/ | sed s/6svn/5/ | sed s/7svn/6/ | sed s/8svn/7/ | sed s/9svn/8/`
|
||||
BOILER_PLATE=`cd src ; svn info 2>&1 | grep Revision`
|
||||
|
||||
strings $LT/$OUT_NAME/GDB.* > $LT/$OUT_NAME/GDBs
|
||||
grep "#$UNIQUE_LINE " $LT/$OUT_NAME/GDBs > $LT/$OUT_NAME/list
|
||||
cat $LT/$OUT_NAME/list | sed 's/0x[^ )]*[ )]/.*/g' | sort | uniq | tee $LT/$OUT_NAME/listuniq
|
||||
|
||||
echo '<html>' >> $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
|
||||
do
|
||||
keycode_file=$(echo $f | sed s/last_crash_sec/$(cat $f).KEYCODEpure/)
|
||||
echo $keycode_file
|
||||
done
|
||||
}
|
||||
|
||||
tidy_keycode () {
|
||||
while read -r k
|
||||
do
|
||||
@ -49,9 +63,62 @@ html_keycode() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
trac_keycode() {
|
||||
echo -n "'''"
|
||||
cat "$f_base.KEYCODEpure" | tidy_keycode
|
||||
echo -n "'''"
|
||||
#echo -n '""'
|
||||
#echo -n '<font color=gray>'
|
||||
cat "$f_base.KEYCODEpure+" | tidy_keycode
|
||||
#echo -n '</font>'
|
||||
|
||||
}
|
||||
|
||||
line2url() {
|
||||
echo "$@" | sed 's/&/%26/g' | sed 's/"/%22/g' | sed 's/#/%23/g' | sed 's/;/%3B/g'
|
||||
}
|
||||
|
||||
text2url() {
|
||||
#echo "$@" |
|
||||
while read -r L
|
||||
do
|
||||
#echo -n `echo "$L" | line2url`'%0A'
|
||||
echo -n `line2url "$L"`'%0A'
|
||||
done
|
||||
}
|
||||
|
||||
report_bug_url () {
|
||||
#http://www.lyx.org/trac/newticket?description=bar%0Abar2&summary=foo%13oo&keywords=crash&version=1.6.5
|
||||
#http://www.lyx.org/trac/newticket?summary=foo%13oo&description=bar%0Abar2&version=1.6.5&keywords=crash
|
||||
#ver=`echo $3 | sed s/1svn/0/ | sed s/2svn/1/ | sed s/3svn/2/ | sed s/4svn/3/ | sed s/5svn/4/ | sed s/6svn/5/ | sed s/7svn/6/ | sed s/8svn/7/ | sed s/9svn/8/`
|
||||
#echo 'http://www.lyx.org/trac/newticket?summary='`line2url "$1"`'&description='`text2url "$2"`'&version='"$LYX_VER"'&keywords=crash'
|
||||
DESC=`get_description | text2url`
|
||||
#DESC=`text2url "$DESC"`
|
||||
if echo $DESC | grep SIGSEGV > /dev/null
|
||||
then
|
||||
KEYWORDSTR="&keywords=crash"
|
||||
else
|
||||
if echo $DESC | grep SIGABRT > /dev/null
|
||||
then
|
||||
KEYWORDSTR="&keywords=assertion"
|
||||
elif echo $DESC | grep SIGSEGV > /dev/null
|
||||
then
|
||||
KEYWORDSTR="crash"
|
||||
fi
|
||||
fi
|
||||
echo 'http://www.lyx.org/trac/newticket?summary='`line2url "$TITLE"`"&description=$DESC&version=$LYX_VER$KEYWORDSTR"
|
||||
#echo 'http://www.lyx.org/trac/newticket?description='"$1"'&summary=foo%13oo&keywords=crash&version=1.6.
|
||||
}
|
||||
|
||||
search_bug_url () {
|
||||
#http://www.lyx.org/trac/search?q=Foo%20bar
|
||||
echo 'http://www.lyx.org/trac/search?q='`line2url "$TITLE"`
|
||||
}
|
||||
|
||||
gdb2html() {
|
||||
echo g $g
|
||||
cat $g | sed 's/&/&/g' | sed 's/</</g' | while read -r l
|
||||
echo g $g'<br/>'
|
||||
head $g -n 100 | sed 's/&/\&/g' | sed 's/</\</g' | sed 's/ /\  /g' | while read -r l
|
||||
do
|
||||
#c=`echo $l | grep -i -o "at [[:alnum:]./]*:[0-9]*"`
|
||||
#We may want to support slashes later, but we'd have to support browsing
|
||||
@ -79,11 +146,60 @@ do
|
||||
done | sed 's/^/<br\/>/'
|
||||
}
|
||||
|
||||
get_description() {
|
||||
echo "Keycodes: "
|
||||
trac_keycode
|
||||
ii=1
|
||||
echo
|
||||
echo To reproduce:
|
||||
cat "$f_base.KEYCODEpure" "$f_base.KEYCODEpure+" | while read -r L
|
||||
do
|
||||
echo "$ii) ... ($L)"
|
||||
ii=$((ii+1))
|
||||
done
|
||||
|
||||
echo
|
||||
echo Arch: `arch`
|
||||
svn_revision $f_base
|
||||
echo '{{{'
|
||||
cat $g
|
||||
echo '}}}'
|
||||
echo
|
||||
echo For more info see the "[[$URL_OF_OUT/$HTML_NAME Keytest Report]]"
|
||||
}
|
||||
|
||||
make_cpp_html() {
|
||||
#This is ugly. At the moment all bug reports in the same set reference the same files, which could lead to confusion if they are from differnt versions of lyx. Do not mix different versions until this is fixed. However we may not want to "fix" this when it may be better to always use a new outdir for each version and just reproduce the old bugs so they don't get lost.
|
||||
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)
|
||||
fi
|
||||
}
|
||||
|
||||
svn_revision() {
|
||||
#| grep ^Revision | sed s/'Revision: '/r/
|
||||
echo KEYCODE $1 ... `dirname $1` 1>&2
|
||||
cat `dirname $1`/last_crash_sec.info.svn | grep ^Revision
|
||||
echo _KEYCODE $KEYCODE ... 1>&2
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
echo beginning
|
||||
#for file in `find $LT/out/ -anewer $LT/out/html | grep replay/last_crash_sec`
|
||||
make_cpp_html
|
||||
#for file in `find $LT/$OUT_NAME/ -anewer $LT/$OUT_NAME/html | grep replay/last_crash_sec`
|
||||
#for file in `find $KEYCODE_DIR | grep save/.*KEYCODEpure`
|
||||
for file in `find $KEYCODE_DIR -anewer oldfile | grep save/.*KEYCODEpure$`
|
||||
#for file in `find $KEYCODE_DIR -anewer oldfile | grep save/.*KEYCODEpure$ | head -n4`
|
||||
#for file in `ls $KEYCODE_DIR/*/final/*KEYCODEpure`
|
||||
#for file in `ls $KEYCODE_DIR/*/final/*/*KEYCODEpure`
|
||||
list_keycode_files
|
||||
echo END OF KEYCODE FILES
|
||||
for file in `list_keycode_files`
|
||||
do
|
||||
echo FILE $file
|
||||
lcs_file=`echo $file | sed 's/save\/.*//g'`last_crash_sec
|
||||
echo last_crash_sec file: $lcs_file
|
||||
SEC2=`cat $lcs_file`
|
||||
@ -99,7 +215,7 @@ do
|
||||
echo f_base $f_base
|
||||
NUM_KEYCODES=`wc -l < "$f_base.KEYCODEpure"`
|
||||
echo NUM_KEYCODES=$NUM_KEYCODES...
|
||||
if [ "$NUM_KEYCODES" -lt 80 ]
|
||||
if [ "$NUM_KEYCODES" -lt 10 ]
|
||||
then
|
||||
echo f_base $f_base
|
||||
f=$f_base.GDB
|
||||
@ -113,29 +229,47 @@ do
|
||||
TITLE="$SIGNAL $IN_AT"
|
||||
TITLE_=`echo $TITLE|sed s/[^[:alnum:]]/_/g`
|
||||
INDEX="index.html"
|
||||
HTML_NAME=$SEC.html # name of html report for this bug
|
||||
echo TITLE $TITLE
|
||||
echo INDEX $INDEX
|
||||
echo NEW $INDEX
|
||||
echo '<html>' >> $LT/out/$INDEX
|
||||
echo -n "<a href=\"$SEC.html\">$TITLE</a> " >> $OUT/indexreport.html
|
||||
html_keycode >> $OUT/indexreport.html
|
||||
if ls $f_base.s*.png
|
||||
then
|
||||
echo -n "<a href=\"$SEC.screenshot.html\">screenshots</a>" >> $OUT/indexreport.html
|
||||
fi
|
||||
echo -n '<br/> '>> $OUT/indexreport.html
|
||||
echo >> $OUT/indexreport.html
|
||||
echo -n '<br> '>> $LT/out/$INDEX
|
||||
echo >> $LT/out/$INDEX
|
||||
echo '<html>' >> $LT/$OUT_NAME/$INDEX
|
||||
(echo -n "<br/><a href=\"$SEC.html\">$TITLE</a> "
|
||||
html_keycode
|
||||
echo " [<a href=\"`search_bug_url`\">search</a>] [<a href=\"`report_bug_url`\">report</a>] <a href=\"$SEC.screenshot.html\">screenshots</a>"
|
||||
#if ls $f_base.s*.png
|
||||
#then
|
||||
# echo "<a href=\"$SEC.screenshot.html\">screenshots</a>"
|
||||
#fi
|
||||
#echo -n '<br/> '
|
||||
echo ) >> $OUT/indexreport.html
|
||||
echo -n '<br> '>> $LT/$OUT_NAME/$INDEX
|
||||
echo >> $LT/$OUT_NAME/$INDEX
|
||||
|
||||
( echo '<html>'
|
||||
echo "<h1>$TITLE</h1>"
|
||||
echo "<title>$TITLE</title>"
|
||||
html_keycode
|
||||
echo "<a href=$SEC.KEYCODE>KEYCODES</a> "
|
||||
echo "<br/><a href=$SEC.KEYCODE>KEYCODES</a> "
|
||||
echo " <a href=$SEC.KEYCODEpure>pure</a> "
|
||||
echo "<a href=$SEC.GDB>GDB</a>"
|
||||
if ls $f_base.s*.png > /dev/null
|
||||
then
|
||||
echo "<a href=\"$SEC.screenshot.html\">screenshots</a>"
|
||||
else
|
||||
echo '(no screenshots)'
|
||||
fi
|
||||
echo "<br/>"
|
||||
|
||||
#echo -n '<br/> '
|
||||
|
||||
#echo "<a href=$SEC.GDB.png><img src=$SEC.small.png/></a><br/><br/>"
|
||||
echo "<a href=$SEC.screenshot.html><img src=$SEC.small.png/></a><br/><br/>"
|
||||
#echo "<a href=$SEC.screenshot.html><img src=$SEC.small.png/></a><br/><br/>"
|
||||
gdb2html
|
||||
(echo ----
|
||||
svn_revision $f_base
|
||||
echo arch `arch`
|
||||
dpkg -l | egrep '(libqt4-dbg|libc6 |libboost-dev )'
|
||||
lsb_release -a) | sed 's/&/\&/g' | sed 's/</\</g' | sed 's/ /\  /g' | sed 's/^/<br\/>/'
|
||||
) > $OUT/$SEC.html
|
||||
echo '<a href="'"$SEC.html"'">'$SEC'</a><br/>' >> $OUT/$INDEX
|
||||
echo '<a href="'"$SEC.html"'">'$SEC'</a><br/>'
|
||||
@ -155,6 +289,8 @@ done
|
||||
mv $OUT/indexreport.html $OUT/indexreport.html.bak
|
||||
echo "<html>" >> $OUT/indexreport.html
|
||||
echo "<h1>List of bugs found</h1>" >> $OUT/indexreport.html
|
||||
echo '<p>Please, do not "report" bugs without searching for them first. Also make sure to fill out the "To reproduce" section before pressing the "Create ticket" button</p>' >> $OUT/indexreport.html
|
||||
sort -k 2 -t '>' < $OUT/indexreport.html.bak >> $OUT/indexreport.html
|
||||
|
||||
firefox $OUT/indexreport.html
|
||||
#google-chrome $OUT/indexreport.html
|
||||
|
6
development/keystest/reproduce.sh
Executable file
6
development/keystest/reproduce.sh
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/bash
|
||||
KT=`dirname $0`
|
||||
AND_THEN_QUIT="y" time $KT/autolyx $1
|
||||
RESULT=$?
|
||||
echo RESULT_REPRODUCE $RESULT
|
||||
exit $RESULT
|
32
development/keystest/setup.sh
Executable file
32
development/keystest/setup.sh
Executable file
@ -0,0 +1,32 @@
|
||||
|
||||
#This won't work on an RPM based distro. Easy to fix though.
|
||||
sudo apt-get install xclip xvkbd wmctrl xvfb libqt4-dbg icewm #svn pylint
|
||||
sudo adduser keytest < /dev/null
|
||||
|
||||
if ! grep keytest /etc/sudoers
|
||||
then
|
||||
echo allowing admin users to switch to keytest user
|
||||
#echo '%adm ALL =(keytest) NOPASSWD: ALL' >> /etc/sudoers
|
||||
fi
|
||||
# cat /mnt/jaunty/etc/cups/printers.conf |grep -o '[^ ]*>$' |grep -v '^<'| sed 's/>$//'
|
||||
|
||||
#we should really handle each printer seperately, but this will work if they are similar
|
||||
if grep AllowUser /etc/cups/printers.conf
|
||||
then
|
||||
echo printer: using whitelisting, nothings needs be done.
|
||||
exit
|
||||
fi
|
||||
|
||||
if grep DenyUser /etc/cups/printers.conf
|
||||
then
|
||||
echo There are already denied users. We do not support this yet, exiting
|
||||
exit
|
||||
fi
|
||||
|
||||
#(cd /etc/cups/ppd/ && ls *.ppd) | sed s/.ppd$// | while read L
|
||||
cat /etc/cups/printers.conf |grep -o '[^ ]*>$' |grep -v '^<'| sed 's/>$//' | while read L
|
||||
do
|
||||
echo $L
|
||||
echo lpadmin -p $L -u deny:keytest
|
||||
lpadmin -p $L -u deny:keytest
|
||||
done
|
642
development/keystest/shared_functions.sh
Executable file
642
development/keystest/shared_functions.sh
Executable file
@ -0,0 +1,642 @@
|
||||
DIRNAME0=`dirname "$0"`
|
||||
#ROOT_OUTDIR="$DIRNAME0/out"
|
||||
OUTDIR="$ROOT_OUTDIR"
|
||||
#OUTDIR="$DIRNAME0/out"
|
||||
THIS_PID=$$
|
||||
|
||||
SRC_DIR=lyx/src
|
||||
EXE_TO_TEST=$SRC_DIR/lyx
|
||||
|
||||
#kill(){
|
||||
# echo kill
|
||||
#}
|
||||
#killall (){
|
||||
# echo killall
|
||||
#}
|
||||
|
||||
mkdirp () {
|
||||
mkdir -p "$1"
|
||||
chmod g+w "$1"
|
||||
}
|
||||
|
||||
kill_all_children() {
|
||||
kill `$DIRNAME0/list_all_children.sh $1`
|
||||
sleep 0.1
|
||||
kill -9 `$DIRNAME0/list_all_children.sh $1`
|
||||
}
|
||||
|
||||
|
||||
#BORED_AFTER_SECS=7200 #If we have spent more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
|
||||
if [ -z $BORED_AFTER_SECS ]
|
||||
then
|
||||
BORED_AFTER_SECS=3600 #If we have spent more than 3600 secs (an hour) replaying a file, without learning anything new, go and start looking for more bugs instead
|
||||
fi
|
||||
|
||||
LAST_CORE=""
|
||||
|
||||
#############################
|
||||
# This section of code is LyX Specific
|
||||
#############################
|
||||
|
||||
if [ ! -e $DIRNAME0/.lyx ]
|
||||
then
|
||||
echo WARNING $DIRNAME0/.lyx does not exist
|
||||
echo will need to regenerate .lyx every test
|
||||
fi
|
||||
|
||||
#if [ ! -e lib/doc.orig ]
|
||||
#then
|
||||
# mv lib/doc lib/doc.orig
|
||||
#fi
|
||||
|
||||
#kill_all_children() {
|
||||
# kill `$DIRNAME0/list_all_children.sh $1`
|
||||
# sleep 0.1
|
||||
# kill -9 `$DIRNAME0/list_all_children.sh $1`
|
||||
#}
|
||||
|
||||
#. $DIRNAME0/shared_functions.sh
|
||||
|
||||
|
||||
ensure_cannot_print () {
|
||||
if [ ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
return
|
||||
fi
|
||||
if lpq
|
||||
then
|
||||
|
||||
echo We can print, this is bad!
|
||||
echo use lpadmin to stop keytest from destroying a forest.
|
||||
full_exit
|
||||
sleep 999999 ; read
|
||||
else
|
||||
echo "Phew, lpq reckons we aren't ready to print. This is a *good* thing!"
|
||||
fi
|
||||
}
|
||||
|
||||
extras_save () {
|
||||
return
|
||||
for f in `ls lib/doc`
|
||||
do
|
||||
if [ lib/doc/$f -nt lib/doc.orig/$f -o ! -e lib/doc.orig/$f ]
|
||||
then
|
||||
#echo making doc dir $OUTDIR/$SEC.doc
|
||||
mkdirp $OUTDIR/$SEC.doc
|
||||
cp -a lib/doc/$f $OUTDIR/$SEC.doc/
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
extras_prepare () {
|
||||
return
|
||||
mkdirp lib/doc/
|
||||
rm lib/doc/*.lyx
|
||||
cp -p lib/doc.orig/*.lyx lib/doc/
|
||||
}
|
||||
|
||||
get_crash_id () {
|
||||
name=`(cat $GDB | grep -o ' in lyx::[[:alnum:]:]*' ; cat $GDB | grep -o ' [ai][nt] [[:alnum:]:]*' ) | head -n3 | sed s/in// | sed 's/ //g'`
|
||||
echo $name | sed 's/ /__/g'
|
||||
}
|
||||
|
||||
calc_confirm_file() {
|
||||
id=`get_crash_id`
|
||||
echo "$ROOT_OUTDIR/$id.reproduced"
|
||||
}
|
||||
|
||||
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/ .*$//'`
|
||||
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
|
||||
sleep 1
|
||||
echo -- if [ "$nPIDs" != "1" ] 1>&2
|
||||
if test "$nPIDs" != "1" #2> /tmp/testerr
|
||||
then
|
||||
echo autolyx: Wrong number of PIDs "$nPIDs" "($1)" "($2)" 1>&2
|
||||
echo autolyx: PIDs "$PID" 1>&2
|
||||
ps x 1>&2
|
||||
echo -----
|
||||
fi
|
||||
echo "$PID"
|
||||
echo got pidof "$1" 1>&2
|
||||
}
|
||||
clean_up () {
|
||||
KT_PID=`get_pid keytest.py x`
|
||||
kill $KT_PID
|
||||
sleep 0.1
|
||||
kill -9 $KT_PID
|
||||
}
|
||||
|
||||
full_exit() {
|
||||
clean_up
|
||||
|
||||
echo attempting to exit this entire script... normal exit may just exit one function
|
||||
|
||||
kill $THIS_PID
|
||||
sleep 1
|
||||
echo We should not get this far
|
||||
sleep 1
|
||||
kill -9 $THIS_PID
|
||||
echo We really should not get this far
|
||||
exit
|
||||
}
|
||||
|
||||
run_gdb () {
|
||||
#Spawn a process to kill lyx if it runs too long
|
||||
if ! touch $GDB
|
||||
then
|
||||
echo cannot touch $GDB
|
||||
full_exit
|
||||
fi
|
||||
(sleep 300; echo KILLER ACTIVATIED ;killall gdb lyx ; sleep 1 ; killall -9 gdb lyx)&
|
||||
KILLER_PID=$!
|
||||
echo KILLING LYX, before starting new lyx
|
||||
killall lyx
|
||||
sleep 1
|
||||
killall lyx -9
|
||||
sleep 1
|
||||
echo Starting GDB
|
||||
#shell svn info $SRC_DIR/
|
||||
(echo "
|
||||
run
|
||||
bt
|
||||
#shell kill $CHILD_PID
|
||||
shell wmctrl -l
|
||||
#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)"
|
||||
kill $KILLER_PID
|
||||
sleep 0.1
|
||||
kill -9 $KILLER_PID
|
||||
|
||||
#### gcore $GDB.core
|
||||
#shell wmctrl -r __renamed__ -b add,shaded
|
||||
#shell wmctrl -r term -b add,shaded
|
||||
#shell wmctrl -r term -b add,shaded
|
||||
#shell wmctrl -R lyx'
|
||||
#
|
||||
#shell import -window root '$GDB.png'
|
||||
#shell import -window root '$GDB..png'
|
||||
#exit
|
||||
}
|
||||
|
||||
|
||||
###########################
|
||||
|
||||
|
||||
|
||||
try_replay () {
|
||||
id=`get_crash_id`
|
||||
echo CRASH_ID
|
||||
export CONFIRM_FILE=`calc_confirm_file`
|
||||
if [ ! -e "$CONFIRM_FILE" ]
|
||||
then
|
||||
echo $CONFIRM_FILE does not exist
|
||||
echo This bug appears not to have been reproduced before
|
||||
echo Will try to reproduce now
|
||||
echo
|
||||
do_replay
|
||||
echo
|
||||
echo Finished attempt at replay
|
||||
else
|
||||
echo $CONFIRM_FILE exists
|
||||
echo This bugs has already been reproduced
|
||||
echo Will not attempt to reproduce again
|
||||
fi
|
||||
}
|
||||
|
||||
do_replay() {
|
||||
(REPLAYFILE="$KEYCODEpure" TAIL_LINES=25 MAX_TAIL_LINES=10000 bash "$0")&
|
||||
TEST_PID="$!"
|
||||
echo Backgrounded $TEST_PID
|
||||
echo waiting for $TEST_PID to finish
|
||||
wait "$TEST_PID"
|
||||
}
|
||||
|
||||
test_replayed () {
|
||||
test -e "$f.replay/last_crash_sec" -o -e "$f.replay/Irreproducible"
|
||||
}
|
||||
|
||||
move_to_replayed () {
|
||||
mkdirp $REPLAY_DIR/replayed
|
||||
mv $f* $REPLAY_DIR/replayed
|
||||
}
|
||||
|
||||
do_queued_replay() {
|
||||
if test_replayed
|
||||
then
|
||||
move_to_replayed
|
||||
else
|
||||
#./development/keytest/killtest
|
||||
killall lyx
|
||||
sleep 1
|
||||
echo killall -9 lyx
|
||||
killall -9 lyx
|
||||
KEYCODEpure="$f" do_replay
|
||||
#if test_replayed
|
||||
#then
|
||||
move_to_replayed
|
||||
#fi
|
||||
fi
|
||||
}
|
||||
|
||||
do_queued_replays() {
|
||||
REPLAY_DIR=$OUTDIR/toreplay
|
||||
echo doing queued_replays
|
||||
echo replays `ls $REPLAY_DIR/*KEYCODEpure`
|
||||
for f in `ls $REPLAY_DIR/*KEYCODEpure`
|
||||
do
|
||||
do_queued_replay
|
||||
done
|
||||
echo done queued_replays
|
||||
(
|
||||
REPLAY_DIR=$OUTDIR/toreproduce
|
||||
export BORED_AFTER_SECS=0
|
||||
echo doing queued_reproduce
|
||||
echo reproduce`ls $REPLAY_DIR/*KEYCODEpure`
|
||||
for f in `ls $REPLAY_DIR/*KEYCODEpure`
|
||||
do
|
||||
do_queued_replay
|
||||
done
|
||||
echo done queued_reproduce
|
||||
)
|
||||
}
|
||||
|
||||
#get_pid() {
|
||||
# ps a | grep $1 | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'
|
||||
#}
|
||||
|
||||
get_version_info() {
|
||||
(cd $SRC_DIR ; svn info) 2>&1 |tee "$1".svn
|
||||
$EXE_TO_TEST -version 2>&1 "$1".version
|
||||
}
|
||||
|
||||
do_one_test() {
|
||||
GDB=$OUTDIR/$SEC.GDB
|
||||
KEYCODE=$OUTDIR/$SEC.KEYCODE
|
||||
KEYCODEpure=$OUTDIR/$SEC.KEYCODEpure
|
||||
NEWHOME=~/kt.dir/$SEC.dir
|
||||
mkdirp $NEWHOME
|
||||
NEWHOME=`cd $NEWHOME; pwd`
|
||||
echo NEWHOME $NEWHOME
|
||||
mkdirp "$NEWHOME"
|
||||
cp -rv $DIRNAME0/.lyx "$NEWHOME"/
|
||||
echo killall -9 lyx latex pdflatex
|
||||
killall -9 lyx latex pdflatex
|
||||
( sleep 9 &&
|
||||
ps a | grep lyx
|
||||
echo -- 1 || full_exit
|
||||
LYX_PID=""
|
||||
i=0
|
||||
echo -- while [ -z "$LYX_PID" -a 200 -gt $i ]
|
||||
while [ -z "$LYX_PID" -a 200 -gt $i ]
|
||||
do
|
||||
#export LYX_PID=`ps a | grep /src/lyx | grep -v grep | sed 's/^ *//g'| sed 's/ .*$//'`
|
||||
export LYX_PID=`get_pid "$EXE_TO_TEST$" `
|
||||
echo LYXPID "$LYX_PID" || full_exit
|
||||
sleep 0.1
|
||||
i=$(($i+1))
|
||||
done
|
||||
echo `ps a | grep $EXE_TO_TEST`
|
||||
echo -- 2
|
||||
echo `ps a | grep $EXE_TO_TEST | grep -v grep`
|
||||
echo -- 3
|
||||
echo `ps a | grep $EXE_TO_TEST | grep -v grep | sed 's/ [a-z].*$//'`
|
||||
echo -- 4
|
||||
echo LYX_PID=$LYX_PID
|
||||
echo XA_PRIMARY | xclip -selection XA_PRIMARY
|
||||
echo XA_SECONDARY | xclip -selection XA_SECONDARY
|
||||
echo XA_CLIPBOARD | xclip -selection XA_CLIPBOARD
|
||||
|
||||
echo -- if [ ! -z "$LYX_PID" ]
|
||||
if [ ! -z "$LYX_PID" ]
|
||||
then
|
||||
kill `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
|
||||
sleep 0.2
|
||||
kill -9 `ps a | grep keytest.py | grep -v grep | cut -c 1-5`
|
||||
while ! wmctrl -r lyx -b add,maximized_vert,maximized_horz
|
||||
do
|
||||
echo trying to maximize lyx
|
||||
sleep 1
|
||||
done
|
||||
echo BEGIN KEYTEST KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py
|
||||
KEYTEST_OUTFILE="$KEYCODEpure" nice -19 python $DIRNAME0/keytest.py | tee $KEYCODE
|
||||
#echo "$!" > $NEWHOME/keytest_py.pid
|
||||
echo END_KEYTEST
|
||||
fi
|
||||
echo NO_KEYTEST
|
||||
echo killall lyx
|
||||
killall lyx
|
||||
sleep 0.1
|
||||
kill -9 "$LYX_PID"
|
||||
killall -9 lyx #sometimes LyX really doesn't want to die causing the script to freeze
|
||||
#killall lyx #sometimes LyX really doesn't want to die causing the script to freeze
|
||||
sleep 1
|
||||
#kill -9 "$LYX_PID" #sometimes LyX really doesn't want to die causing the script to freeze
|
||||
|
||||
#sleep 1
|
||||
#killall -9 lyx
|
||||
) &
|
||||
CHILD_PID="$!"
|
||||
ls $EXE_TO_TEST ; sleep 1
|
||||
pwd
|
||||
|
||||
#You may want to use the following to simulate SIGFPE
|
||||
#(sleep 90 && killall -8 lyx) &
|
||||
echo TTL $TAIL_LINES
|
||||
extras_prepare
|
||||
ensure_cannot_print
|
||||
run_gdb
|
||||
# (run_gdb) &
|
||||
# GDBTASK_PID="$!"
|
||||
# (sleep 600 ; kill "$!")
|
||||
# echo WAITING FOR: wait $GDBTASK_PID
|
||||
# wait $GDBTASK_PID
|
||||
# echo NOLONGER waiting for: wait $GDBTASK_PID
|
||||
|
||||
echo END gdb
|
||||
kill $CHILD_PID
|
||||
KT_PID=`get_pid keytest.py`
|
||||
echo KT_PID=$KT_PID
|
||||
kill $KT_PID
|
||||
sleep 0.3
|
||||
kill -9 $CHILD_PID
|
||||
kill -9 $KT_PID
|
||||
# Or use "exited normally":
|
||||
echo END gdb2
|
||||
# these tend to take up a huge amount of space:
|
||||
echo will erase "$NEWHOME"
|
||||
sleep 2
|
||||
rm -rf $NEWHOME
|
||||
if (grep " signal SIG[^TK]" $GDB || grep KILL_FREEZE $KEYCODE)
|
||||
then
|
||||
extras_save
|
||||
mkdirp $OUTDIR/save && (
|
||||
ln $OUTDIR/$SEC.* $OUTDIR/save ||
|
||||
cp $OUTDIR/$SEC.* $OUTDIR/save)
|
||||
LAST_CRASH_SEC=$SEC
|
||||
echo $LAST_CRASH_SEC > $OUTDIR/last_crash_sec
|
||||
get_version_info $OUTDIR/last_crash_sec.info
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
LAST_EVENT="$SEC"
|
||||
echo Reproducible > $OUTDIR/Reproducible
|
||||
fi
|
||||
TAIL_LINES=""
|
||||
if [ -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo ATTEMPTING TO REPLAY
|
||||
try_replay
|
||||
else
|
||||
export KEYTEST_INFILE=$KEYCODEpure
|
||||
NUM_KEYCODES=`wc -l < $KEYCODEpure`
|
||||
echo NUM_KEYCODES $NUM_KEYCODES, was $LAST_NUM_KEYCODES
|
||||
if [ "$NUM_KEYCODES" != "$LAST_NUM_KEYCODES" ]
|
||||
then
|
||||
LAST_EVENT="$SEC"
|
||||
LAST_NUM_KEYCODES=$NUM_KEYCODES
|
||||
echo "Hooray! we have eleminated some keycodes"
|
||||
fi
|
||||
fi
|
||||
if [ ! -z "$AND_THEN_QUIT" ]
|
||||
then
|
||||
RESULT=1
|
||||
echo RR 1
|
||||
return 1
|
||||
fi
|
||||
if [ ! -z "$LAST_CORE" ]
|
||||
then
|
||||
rm "$LAST_CORE"
|
||||
fi
|
||||
LAST_CORE="$GDB.core"
|
||||
else
|
||||
if ! test -z "$BAK"
|
||||
then
|
||||
echo will erase '$BAK/*'="'$BAK/*'"
|
||||
sleep 2
|
||||
rm -rf $BAK/*
|
||||
mv $OUTDIR/$SEC.* $BAK/
|
||||
else
|
||||
echo "BAK is null"
|
||||
fi
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
echo TTL3 $TAIL_LINES
|
||||
echo MAX_TAIL_LINES "$MAX_TAIL_LINES"
|
||||
TAIL_LINES=$(($TAIL_LINES*2))
|
||||
echo TTL4 $TAIL_LINES
|
||||
if [ "$TAIL_LINES" -ge "0$MAX_TAIL_LINES" -a ! -z "$MAX_TAIL_LINES" ]
|
||||
then
|
||||
echo Giving up because $TAIL_LINES '>' $MAX_TAIL_LINES
|
||||
echo Irreproducible > $OUTDIR/Irreproducible
|
||||
full_exit
|
||||
fi
|
||||
fi
|
||||
if [ ! -z "$AND_THEN_QUIT" ]
|
||||
then
|
||||
RESULT=0
|
||||
echo RR 0
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo TTL2 $TAIL_LINES
|
||||
fi
|
||||
}
|
||||
|
||||
test_exist () {
|
||||
if [ ! -e "$1" ]
|
||||
then
|
||||
echo "$1" does not exist!
|
||||
full_exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
assert () {
|
||||
if ! "$@"
|
||||
then
|
||||
echo "Assertion '$*' Failed!"
|
||||
full_exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
#####################################################
|
||||
# MAIN
|
||||
#####################################################
|
||||
|
||||
#Start basic sanity checks
|
||||
|
||||
autolyx_main () {
|
||||
|
||||
if [ ! -e "$EXE_TO_TEST" ]
|
||||
then
|
||||
echo "$EXE_TO_TEST" does not exist
|
||||
echo Cannot proceed
|
||||
exit
|
||||
fi
|
||||
|
||||
assert which xvkbd
|
||||
assert which wmctrl
|
||||
|
||||
if ! wmctrl -l > /dev/null
|
||||
then
|
||||
echo autolyx: cannot run wmctrl -l
|
||||
exit
|
||||
fi
|
||||
|
||||
test_exist "$EXE_TO_TEST"
|
||||
test_exist "$DIRNAME0/keytest.py"
|
||||
|
||||
if ! test -z "`pylint -e $DIRNAME0/keytest.py`"
|
||||
then
|
||||
echo "$DIRNAME0/keytest.py" has python errors
|
||||
exit
|
||||
fi
|
||||
|
||||
ensure_cannot_print
|
||||
|
||||
#End basic sanity checks
|
||||
|
||||
if [ ! -z "$1" ]
|
||||
then
|
||||
REPLAYFILE=$1
|
||||
fi
|
||||
|
||||
if [ ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo REPLAYMODE
|
||||
OUTDIR="$REPLAYFILE.replay/"
|
||||
mkdirp $REPLAYFILE.replay/ || full_exit
|
||||
export KEYTEST_INFILE=$REPLAYFILE
|
||||
if [ ! -e "$REPLAYFILE" ]
|
||||
then
|
||||
echo "$REPLAYFILE" does not exist
|
||||
echo exiting
|
||||
full_exit 1
|
||||
fi
|
||||
else
|
||||
do_queued_replays
|
||||
echo RANDOM MODE
|
||||
fi
|
||||
|
||||
get_pid [0-9].x-session-manager"$" x
|
||||
export X_PID=`get_pid [0-9].x-session-manager x`
|
||||
echo X_PID $X_PID
|
||||
|
||||
export TAIL_LINES=$TAIL_LINES
|
||||
echo TL $TAIL_LINES
|
||||
|
||||
|
||||
BAK="$OUTDIR/backup"
|
||||
mkdirp $BAK
|
||||
|
||||
|
||||
|
||||
|
||||
#rename other windows to avoid confusion.
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
wmctrl -N __renamed__ -r lyx
|
||||
export PATH=`cd $DIRNAME0; pwd`/path:$PATH
|
||||
|
||||
if [ ! -z "$1" ]
|
||||
then
|
||||
SEC=`date +%s`
|
||||
export MAX_DROP=0
|
||||
if [ ".$SCREENSHOT_OUT." = ".auto." ]
|
||||
then
|
||||
echo SCREENSHOT_OUT was $SCREENSHOT_OUT.
|
||||
export SCREENSHOT_OUT="$OUTDIR/$SEC.s"
|
||||
echo SCREENSHOT_OUT is $SCREENSHOT_OUT.
|
||||
#exit
|
||||
fi
|
||||
export RESULT=179
|
||||
do_one_test #| tee do_one_test.log
|
||||
RESULT="$?"
|
||||
echo Ressult $RESULT
|
||||
|
||||
kill `list_all_children.sh $$`
|
||||
sleep 0.1
|
||||
kill -9 `list_all_children.sh $$`
|
||||
|
||||
exit $RESULT
|
||||
|
||||
#echo done ; sleep 1
|
||||
full_exit
|
||||
fi
|
||||
|
||||
|
||||
|
||||
(
|
||||
echo TTL $TAIL_LINES
|
||||
|
||||
LAST_EVENT=`date +%s` # Last time something interesting happened. If nothing interesting has happened for a while, we should quit.
|
||||
|
||||
ensure_cannot_print
|
||||
echo X_PID $X_PID
|
||||
export X_PID=`get_pid [0-9].x-session-manager"$" x`
|
||||
echo PATH $PATH
|
||||
while true
|
||||
do
|
||||
echo Currently running autolyx PID=$$
|
||||
if [ ! -z "$TAIL_LINES" ]
|
||||
then
|
||||
echo TAIL_LINES: "$TAIL_LINES"
|
||||
TAIL_FILE=$OUTDIR/tail_"$TAIL_LINES"
|
||||
tail -n "$TAIL_LINES" "$REPLAYFILE" > $TAIL_FILE
|
||||
KEYTEST_INFILE=$TAIL_FILE
|
||||
MAX_DROP=0
|
||||
else
|
||||
MAX_DROP=0.2
|
||||
fi
|
||||
export MAX_DROP
|
||||
SEC=`date +%s`
|
||||
if [ -z "$TAIL_LINES" -a ! -z "$REPLAYFILE" ]
|
||||
then
|
||||
echo Boredom factor: $SEC-$LAST_EVENT'=' $(($SEC-$LAST_EVENT))
|
||||
if [ $(($SEC-$LAST_EVENT)) -gt $BORED_AFTER_SECS ]
|
||||
then
|
||||
echo
|
||||
echo Is is now $SEC seconds
|
||||
echo The last time we managed to eliminate a keycode was at $LAST_EVENT
|
||||
echo We get bored after $BORED_AFTER_SECS seconds
|
||||
echo Giving up now.
|
||||
echo
|
||||
echo $LAST_CRASH_SEC > $OUTDIR/Finished
|
||||
SEC=$LAST_CRASH_SEC #I used SEC in place of LAST_CRASH_SEC. Here is a quick fix.
|
||||
#make screenshots
|
||||
if [ `cat $OUTDIR/$SEC.KEYCODEpure | wc -l` -lt 40 ] # If many keycodes, dont bother trying to make screenshots
|
||||
then
|
||||
echo "Making screenschot of $OUTDIR/$SEC.KEYCODEpure"
|
||||
test -e $OUTDIR/$SEC.KEYCODEpure || echo "DOES NOT EXIST: $OUTDIR/$SEC.KEYCODEpure"
|
||||
(SCREENSHOT_OUT="auto" ./doNtimes.sh 9 ./reproduce.sh $OUTDIR/$SEC.KEYCODEpure ; echo $f )
|
||||
fi
|
||||
mkdirp $OUTDIR/final
|
||||
mkdirp $OUTDIR/final_cp
|
||||
#chmod g+w $OUTDIR/final
|
||||
ln $OUTDIR/$SEC* $OUTDIR/final || cp $OUTDIR/$SEC* $OUTDIR/final
|
||||
cp $OUTDIR/$SEC* $OUTDIR/final_cp/
|
||||
cp -rv $OUTDIR/$SEC.replay $OUTDIR/final_cp/
|
||||
CONFIRM_FILE=`calc_confirm_file`
|
||||
echo Reproducible > "$CONFIRM_FILE"
|
||||
|
||||
|
||||
full_exit
|
||||
fi
|
||||
else
|
||||
do_queued_replays
|
||||
fi
|
||||
do_one_test
|
||||
done
|
||||
kill_all_children $$
|
||||
) 2>&1 |tee $OUTDIR/log
|
||||
kill_all_children $$
|
||||
}
|
3
development/keystest/shared_variables.sh
Normal file
3
development/keystest/shared_variables.sh
Normal file
@ -0,0 +1,3 @@
|
||||
DIRNAME0=`dirname "$0"`
|
||||
OUT_NAME=out.2
|
||||
ROOT_OUTDIR="$DIRNAME0/$OUT_NAME"
|
3
development/keystest/view:1
Executable file
3
development/keystest/view:1
Executable file
@ -0,0 +1,3 @@
|
||||
(DISPLAY=:1 import -window root /tmp/:1.png)
|
||||
#gwenview /tmp/:1.png
|
||||
eog /tmp/:1.png
|
@ -1,26 +1,27 @@
|
||||
|
||||
. ./shared_variables.sh
|
||||
OUT="$ROOT_OUTDIR"
|
||||
NOW_SEC=`date +%s`
|
||||
echo NOW_SEC $NOW_SEC
|
||||
echo recently modified files:
|
||||
LATEST_FILE=`ls out/* -td -1 | grep -v log | head -n1`
|
||||
LATEST_FILE=`ls $ROOT_OUTDIR/* -td -1 | grep -v log | head -n1`
|
||||
echo $LATEST_FILE | (
|
||||
grep replay > /dev/null || (
|
||||
ls out/* -lotd | head
|
||||
ls $ROOT_OUTDIR/* -lotd | head -n6
|
||||
)
|
||||
)
|
||||
ls out/* -tdo -1 | grep replay |head -n4
|
||||
ls $ROOT_OUTDIR/* -tdo -1 | grep replay |head -n4
|
||||
|
||||
LATEST_FILE=`ls out/* -td -1 | grep replay | head -n1`
|
||||
if [ $LATEST_FILE = "out/toreplay" ]
|
||||
LATEST_FILE=`ls $ROOT_OUTDIR/* -td -1 | grep replay | head -n1`
|
||||
if [ $LATEST_FILE = "$ROOT_OUTDIR/toreplay" ]
|
||||
then
|
||||
#echo foo
|
||||
LATEST_FILE=`ls out/toreplay/* -td -1 | grep replay | head -n1`
|
||||
LATEST_FILE=`ls $ROOT_OUTDIR/toreplay/* -td -1 | grep replay | head -n1`
|
||||
fi
|
||||
|
||||
if [ $LATEST_FILE = "out/toreplay/replayed" ]
|
||||
if [ $LATEST_FILE = "$ROOT_OUTDIR/toreplay/replayed" ]
|
||||
then
|
||||
echo foo
|
||||
LATEST_FILE=`ls out/toreplay/replayed/* -td -1 | grep replay | head -n1`
|
||||
LATEST_FILE=`ls $ROOT_OUTDIR/toreplay/replayed/* -td -1 | grep replay | head -n1`
|
||||
else
|
||||
echo oof
|
||||
fi
|
||||
@ -35,14 +36,14 @@ 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 15
|
||||
cat $LATEST_FILE/$SEC.GDB | grep "signal SIG" -A 10
|
||||
else
|
||||
ls $LATEST_FILE -lot | head
|
||||
cat `echo $LATEST_FILE | sed s/KEYCODEpure.replay/GDB/` | grep "signal SIG" -A 29
|
||||
cat `echo $LATEST_FILE | sed s/KEYCODEpure.replay/GDB/` | grep "signal SIG" -A 19
|
||||
fi
|
||||
cat $LATEST_FILE/log | grep Bore | tail -n2
|
||||
) || (
|
||||
ls out/* -lotd | head
|
||||
ls $ROOT_OUTDIR/* -lotd | head
|
||||
)
|
||||
)
|
||||
|
||||
@ -51,11 +52,11 @@ grep -F "autolyx:
|
||||
Trace
|
||||
reproduced
|
||||
X_PID
|
||||
x-session" out/log | grep -v kill | grep -v Terminated | tail -n 9
|
||||
x-session" $ROOT_OUTDIR/log | grep -v kill | grep -v Terminated | tail -n 9
|
||||
#exit
|
||||
echo autolyx crashes ---------
|
||||
grep autolyx: out/log | grep -v kill | grep -v Terminated #-A 5
|
||||
grep autolyx: $ROOT_OUTDIR/log | grep -v kill | grep -v Terminated #-A 5
|
||||
echo python crashes ---------
|
||||
grep -i -a Trace out/log -A 7 | tail -n8
|
||||
grep -i -a Trace $ROOT_OUTDIR/log -A 7 | tail -n8
|
||||
#echo misc ----
|
||||
#grep reproduced out/log | tail -n5
|
||||
#grep reproduced $ROOT_OUTDIR/log | tail -n5
|
||||
|
Loading…
Reference in New Issue
Block a user