You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
123 lines
2.4 KiB
123 lines
2.4 KiB
#!/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
|
|
|