| Index: tools/valgrind/regrind.sh
|
| ===================================================================
|
| --- tools/valgrind/regrind.sh (Revision 0)
|
| +++ tools/valgrind/regrind.sh (Revision 0)
|
| @@ -0,0 +1,132 @@
|
| +#!/bin/sh
|
| +# Scape errors from the valgrind bots, reproduce them locally,
|
| +# save logs as regrind-TESTNAME.log, and display any errors found.
|
| +# Also save files regrind-failed.txt listing failed tests,
|
| +# and regrind-failed-map.txt showing which bot URLs have which failed tests
|
| +# (handy when filing bugs).
|
| +#
|
| +# Only scrapes linux layout bot at the moment.
|
| +# TODO: handle layout tests that don't have obvious path to test file
|
| +# TODO: extend script to handle more kinds of errors and more tests
|
| +
|
| +# where the valgrind layout bot results live
|
| +LAYOUT_URL="http://build.chromium.org/buildbot/waterfall/builders/Webkit%20Linux%20(valgrind%20layout)"
|
| +# how many builds back to check
|
| +LAYOUT_COUNT=250
|
| +
|
| +# regexp to match valgrind errors
|
| +PATTERN="are definitely|uninitialised|Unhandled exception|\
|
| +Invalid read|Invalid write|Invalid free|Source and desti|Mismatched free|\
|
| +unaddressable byte|vex x86|the 'impossible' happened|\
|
| +valgrind:.*: Assertion.*failed|VALGRIND INTERNAL ERROR"
|
| +
|
| +usage() {
|
| + echo "Usage: regrind.sh [--noscrape][--norepro][--keep]"
|
| + echo "--noscrape: don't scrape bots, just use old regrind-failed.txt"
|
| + echo "--norepro: don't reproduce locally"
|
| + echo "--keep: keep temp files"
|
| + exit 1
|
| +}
|
| +
|
| +# Given a log on stdin, list all the tests that failed in that log.
|
| +layout_list_failed_tests() {
|
| + grep "Command:.*LayoutTests" |
|
| + sed 's/<.*>//' |
|
| + sed 's/.*LayoutTests/LayoutTests/' |
|
| + sort -u |
|
| + tr -d '\015'
|
| +}
|
| +
|
| +# Generate a list of failed tests in regrind-failed.txt by scraping bot.
|
| +# Scrape most recent first, so if user interrupts, he is left with fresh-ish data.
|
| +scrape_layout() {
|
| + rm -f regrind-*.tmp* regrind-failed.txt regrind-failed-map.txt
|
| + touch regrind-failed.txt
|
| +
|
| + # First, grab the number of the latest complete build.
|
| + wget -q -O regrind-builds.html "$LAYOUT_URL"
|
| + latest=`grep "<li><font .*" < regrind-builds.html | head -1 | sed 's/.*#//;s/<.*//'`
|
| +
|
| + echo "Fetching $LAYOUT_COUNT logs from bot"
|
| + # Scrape the desired number of runs (150 is about one cycle)
|
| + first=`expr $latest - $LAYOUT_COUNT`
|
| + i=$latest
|
| + while test $i -ge $first
|
| + do
|
| + url="$LAYOUT_URL/builds/$i/steps/valgrind%20test:%20layout/logs/stdio"
|
| + wget -q -O regrind-$i.tmp "$url"
|
| + # Did any tests fail in this file?
|
| + layout_list_failed_tests < regrind-$i.tmp > regrind-$i.tmp.failed
|
| + if test -s regrind-$i.tmp.failed
|
| + then
|
| + # Yes. Log them to stdout,
|
| + echo "$url"
|
| + cat regrind-$i.tmp.failed
|
| + # to the table regrind-failed-map.txt,
|
| + cat regrind-$i.tmp.failed | sed "s,^,$url ," >> regrind-failed-map.txt
|
| + # and, if not already there, to regrind-failed.txt.
|
| + for test in `cat regrind-$i.tmp.failed`
|
| + do
|
| + fgrep "$test" regrind-failed.txt > /dev/null 2>&1 || echo "$test" >> regrind-failed.txt
|
| + done
|
| + else
|
| + rm regrind-$i.tmp.failed
|
| + fi
|
| + # Sleep 1/3 sec per fetch
|
| + case $i in
|
| + *[036]) sleep 1;;
|
| + esac
|
| + i=`expr $i - 1`
|
| + done
|
| +
|
| + # Finally, munge the logs to identify tests that probably failed.
|
| + sh c.sh -l regrind-*.tmp > regrind-errfiles.txt
|
| + cat `cat regrind-errfiles.txt` | layout_list_failed_tests > regrind-failed.txt
|
| +}
|
| +
|
| +# Run the tests identified in regrind-failed.txt locally under valgrind.
|
| +# Save logs in regrind-$TESTNAME.log.
|
| +repro_layout() {
|
| + echo Running `wc -l < regrind-failed.txt` layout tests.
|
| + for test in `cat regrind-failed.txt`
|
| + do
|
| + logname="`echo $test | tr / _`"
|
| + echo "sh tools/valgrind/valgrind_webkit_tests.sh $test"
|
| + sh tools/valgrind/valgrind_webkit_tests.sh "$test" > regrind-"$logname".log 2>&1
|
| + egrep "$PATTERN" < regrind-"$logname".log | sed 's/==.*==//'
|
| + done
|
| +}
|
| +
|
| +do_repro=1
|
| +do_scrape=1
|
| +do_cleanup=1
|
| +while test ! -z "$1"
|
| +do
|
| + case "$1" in
|
| + --noscrape) do_scrape=0;;
|
| + --norepro) do_repro=0;;
|
| + --keep) do_cleanup=0;;
|
| + *) usage;;
|
| + esac
|
| + shift
|
| +done
|
| +
|
| +if test $do_scrape = 0 && test $do_repro = 0
|
| +then
|
| + usage
|
| +fi
|
| +
|
| +if test $do_scrape = 1
|
| +then
|
| + scrape_layout
|
| +fi
|
| +
|
| +if test $do_repro = 1
|
| +then
|
| + repro_layout
|
| +fi
|
| +
|
| +if test $do_cleanup = 1
|
| +then
|
| + rm -f regrind-errfiles.txt regrind-*.tmp*
|
| +fi
|
|
|
| Eigenschaftsänderungen: tools/valgrind/regrind.sh
|
| ___________________________________________________________________
|
| HinzugefĂĽgt: svn:eol-style
|
| + LF
|
|
|
|
|