• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
17LAYOUT_URL="http://build.chromium.org/p/chromium.memory.fyi/builders/Webkit%20Linux%20(valgrind%20layout)"
18# how many builds back to check
19LAYOUT_COUNT=250
20
21# regexp to match valgrind errors
22PATTERN="are definitely|uninitialised|Unhandled exception|\
23Invalid read|Invalid write|Invalid free|Source and desti|Mismatched free|\
24unaddressable byte|vex x86|the 'impossible' happened|\
25valgrind:.*: Assertion.*failed|VALGRIND INTERNAL ERROR"
26
27usage() {
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.
36layout_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.
46scrape_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.
93repro_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
104do_repro=1
105do_scrape=1
106do_cleanup=1
107while test ! -z "$1"
108do
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
116done
117
118echo "WARNING: This script is not supported and may be out of date"
119
120if test $do_scrape = 0 && test $do_repro = 0
121then
122  usage
123fi
124
125if test $do_scrape = 1
126then
127  scrape_layout
128fi
129
130if test $do_repro = 1
131then
132  repro_layout
133fi
134
135if test $do_cleanup = 1
136then
137  rm -f regrind-errfiles.txt regrind-*.tmp*
138fi
139