Browse Source
After running the valgrind tests with GIT_TEST_TREE=t, the test output is in the test-results/$TEST.out files. Call ./valgrind/analyze.sh in $GIT_ROOT/t/ to group the valgrind errors by backtrace. Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Johannes Schindelin
16 years ago
committed by
Junio C Hamano
1 changed files with 123 additions and 0 deletions
@ -0,0 +1,123 @@
@@ -0,0 +1,123 @@
|
||||
#!/bin/sh |
||||
|
||||
out_prefix=$(dirname "$0")/../test-results/valgrind.out |
||||
output= |
||||
count=0 |
||||
total_count=0 |
||||
missing_message= |
||||
new_line=' |
||||
' |
||||
|
||||
# start outputting the current valgrind error in $out_prefix.++$count, |
||||
# and the test case which failed in the corresponding .message file |
||||
start_output () { |
||||
test -z "$output" || return |
||||
|
||||
# progress |
||||
total_count=$(($total_count+1)) |
||||
test -t 2 && printf "\rFound %d errors" $total_count >&2 |
||||
|
||||
count=$(($count+1)) |
||||
output=$out_prefix.$count |
||||
: > $output |
||||
|
||||
echo "*** $1 ***" > $output.message |
||||
} |
||||
|
||||
finish_output () { |
||||
test ! -z "$output" || return |
||||
output= |
||||
|
||||
# if a test case has more than one valgrind error, we need to |
||||
# copy the last .message file to the previous errors |
||||
test -z "$missing_message" || { |
||||
while test $missing_message -lt $count |
||||
do |
||||
cp $out_prefix.$count.message \ |
||||
$out_prefix.$missing_message.message |
||||
missing_message=$(($missing_message+1)) |
||||
done |
||||
missing_message= |
||||
} |
||||
} |
||||
|
||||
# group the valgrind errors by backtrace |
||||
output_all () { |
||||
last_line= |
||||
j=0 |
||||
i=1 |
||||
while test $i -le $count |
||||
do |
||||
# output <number> <backtrace-in-one-line> |
||||
echo "$i $(tr '\n' ' ' < $out_prefix.$i)" |
||||
i=$(($i+1)) |
||||
done | |
||||
sort -t ' ' -k 2 | # order by <backtrace-in-one-line> |
||||
while read number line |
||||
do |
||||
# find duplicates, do not output backtrace twice |
||||
if test "$line" != "$last_line" |
||||
then |
||||
last_line=$line |
||||
j=$(($j+1)) |
||||
printf "\nValgrind error $j:\n\n" |
||||
cat $out_prefix.$number |
||||
printf "\nfound in:\n" |
||||
fi |
||||
# print the test case where this came from |
||||
printf "\n" |
||||
cat $out_prefix.$number.message |
||||
done |
||||
} |
||||
|
||||
handle_one () { |
||||
OLDIFS=$IFS |
||||
IFS="$new_line" |
||||
while read line |
||||
do |
||||
case "$line" in |
||||
# backtrace, possibly a new one |
||||
==[0-9]*) |
||||
|
||||
# Does the current valgrind error have a message yet? |
||||
case "$output" in |
||||
*.message) |
||||
test -z "$missing_message" && |
||||
missing_message=$count |
||||
output= |
||||
esac |
||||
|
||||
start_output $(basename $1) |
||||
echo "$line" | |
||||
sed 's/==[0-9]*==/==valgrind==/' >> $output |
||||
;; |
||||
# end of backtrace |
||||
'}') |
||||
test -z "$output" || { |
||||
echo "$line" >> $output |
||||
test $output = ${output%.message} && |
||||
output=$output.message |
||||
} |
||||
;; |
||||
# end of test case |
||||
'') |
||||
finish_output |
||||
;; |
||||
# normal line; if $output is set, print the line |
||||
*) |
||||
test -z "$output" || echo "$line" >> $output |
||||
;; |
||||
esac |
||||
done < $1 |
||||
IFS=$OLDIFS |
||||
|
||||
# just to be safe |
||||
finish_output |
||||
} |
||||
|
||||
for test_script in "$(dirname "$0")"/../test-results/*.out |
||||
do |
||||
handle_one $test_script |
||||
done |
||||
|
||||
output_all |
Loading…
Reference in new issue