Home | History | Annotate | Download | only in valgrind
      1 #!/bin/sh
      2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
      3 # Use of this source code is governed by a BSD-style license that can be
      4 # found in the LICENSE file.
      5 
      6 # Scape errors from the valgrind bots, reproduce them locally,
      7 # save logs as regrind-TESTNAME.log, and display any errors found.
      8 # Also save files regrind-failed.txt listing failed tests,
      9 # and regrind-failed-map.txt showing which bot URLs have which failed tests
     10 # (handy when filing bugs).
     11 #
     12 # Only scrapes linux layout bot at the moment.
     13 # TODO: handle layout tests that don't have obvious path to test file
     14 # TODO: extend script to handle more kinds of errors and more tests
     15 
     16 # where the valgrind layout bot results live
     17 LAYOUT_URL="http://build.chromium.org/p/chromium.memory.fyi/builders/Webkit%20Linux%20(valgrind%20layout)"
     18 # how many builds back to check
     19 LAYOUT_COUNT=250
     20 
     21 # regexp to match valgrind errors
     22 PATTERN="are definitely|uninitialised|Unhandled exception|\
     23 Invalid read|Invalid write|Invalid free|Source and desti|Mismatched free|\
     24 unaddressable byte|vex x86|the 'impossible' happened|\
     25 valgrind:.*: Assertion.*failed|VALGRIND INTERNAL ERROR"
     26 
     27 usage() {
     28   echo "Usage: regrind.sh [--noscrape][--norepro][--keep]"
     29   echo "--noscrape: don't scrape bots, just use old regrind-failed.txt"
     30   echo "--norepro: don't reproduce locally"
     31   echo "--keep: keep temp files"
     32   exit 1
     33 }
     34 
     35 # Given a log on stdin, list all the tests that failed in that log.
     36 layout_list_failed_tests() {
     37   grep "Command:.*LayoutTests" |
     38     sed 's/<.*>//' |
     39     sed 's/.*LayoutTests/LayoutTests/' |
     40     sort -u |
     41     tr -d '\015'
     42 }
     43 
     44 # Generate a list of failed tests in regrind-failed.txt by scraping bot.
     45 # Scrape most recent first, so if user interrupts, he is left with fresh-ish data.
     46 scrape_layout() {
     47   rm -f regrind-*.tmp* regrind-failed.txt regrind-failed-map.txt
     48   touch regrind-failed.txt
     49 
     50   # First, grab the number of the latest complete build.
     51   wget -q -O regrind-builds.html "$LAYOUT_URL"
     52   latest=`grep "<li><font .*" < regrind-builds.html | head -1 | sed 's/.*#//;s/<.*//'`
     53 
     54   echo "Fetching $LAYOUT_COUNT logs from bot"
     55   # Scrape the desired number of runs (150 is about one cycle)
     56   first=`expr $latest - $LAYOUT_COUNT`
     57   i=$latest
     58   while test $i -ge $first
     59   do
     60     url="$LAYOUT_URL/builds/$i/steps/valgrind%20test:%20layout/logs/stdio"
     61     wget -q -O regrind-$i.tmp "$url"
     62     # Did any tests fail in this file?
     63     layout_list_failed_tests < regrind-$i.tmp > regrind-$i.tmp.failed
     64     if test -s regrind-$i.tmp.failed
     65     then
     66       # Yes.  Log them to stdout,
     67       echo "$url"
     68       cat regrind-$i.tmp.failed
     69       # to the table regrind-failed-map.txt,
     70       cat regrind-$i.tmp.failed | sed "s,^,$url ,"   >> regrind-failed-map.txt
     71       # and, if not already there, to regrind-failed.txt.
     72       for test in `cat regrind-$i.tmp.failed`
     73       do
     74         fgrep "$test" regrind-failed.txt > /dev/null 2>&1 || echo "$test" >> regrind-failed.txt
     75       done
     76     else
     77       rm regrind-$i.tmp.failed
     78     fi
     79     # Sleep 1/3 sec per fetch
     80     case $i in
     81     *[036]) sleep 1;;
     82     esac
     83     i=`expr $i - 1`
     84   done
     85 
     86   # Finally, munge the logs to identify tests that probably failed.
     87   sh c.sh -l regrind-*.tmp > regrind-errfiles.txt
     88   cat `cat regrind-errfiles.txt` | layout_list_failed_tests > regrind-failed.txt
     89 }
     90 
     91 # Run the tests identified in regrind-failed.txt locally under valgrind.
     92 # Save logs in regrind-$TESTNAME.log.
     93 repro_layout() {
     94   echo Running `wc -l < regrind-failed.txt` layout tests.
     95   for test in `cat regrind-failed.txt`
     96   do
     97     logname="`echo $test | tr / _`"
     98     echo "sh tools/valgrind/valgrind_webkit_tests.sh $test"
     99     sh tools/valgrind/valgrind_webkit_tests.sh "$test" > regrind-"$logname".log 2>&1
    100     egrep "$PATTERN" < regrind-"$logname".log | sed 's/==.*==//'
    101   done
    102 }
    103 
    104 do_repro=1
    105 do_scrape=1
    106 do_cleanup=1
    107 while test ! -z "$1"
    108 do
    109   case "$1" in
    110   --noscrape) do_scrape=0;;
    111   --norepro) do_repro=0;;
    112   --keep) do_cleanup=0;;
    113   *) usage;;
    114   esac
    115   shift
    116 done
    117 
    118 echo "WARNING: This script is not supported and may be out of date"
    119 
    120 if test $do_scrape = 0 && test $do_repro = 0
    121 then
    122   usage
    123 fi
    124 
    125 if test $do_scrape = 1
    126 then
    127   scrape_layout
    128 fi
    129 
    130 if test $do_repro = 1
    131 then
    132   repro_layout
    133 fi
    134 
    135 if test $do_cleanup = 1
    136 then
    137   rm -f regrind-errfiles.txt regrind-*.tmp*
    138 fi
    139