valgrind_test_cleaner.pl 1.31 KB
Newer Older
1
2
3
4
#!/usr/bin/perl
use strict;
use warnings;

5
6
7
8
9
10
11
12
13
14
15
16
# This script can be used on a valgrind output of the tests (from
# tests_in_valgrind.sh) to remove some uninteresting error reports.
# Since we care about the tested application not leaking/crashing, not
# the tests itself, memory leaks that are caused only by the tests
# (eg. unreleased test data), we don't want to have logs full of them.
#
# This script does some heuristics to eliminate some of such error
# reports. Currently, the memory lost reports whose stack contains
# no call from the real application are suppressed.
#
# Of course, the rest still can contain many uninteresting entries.

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
my ($block, $blockOK);

sub endBlock(_) {
	return unless $block;
	if ($blockOK) {
		print @$block;
	}
	undef $block;
	undef $blockOK;
}

sub startBlock(_) {
	$block = [@_];
}

sub addToBlock(_) {
	my ($line) = @_;
	push @$block, $line;
	return unless $line =~ /^==\d+==\s+(at|by) 0x[0-9A-F]+: (.*) \(.+:\d+\)$/;
	$_ = $2;
	return $blockOK = 1 if /^isc::/;
	return $blockOK = 1 if /^asiolink:/;
	return if /^main \(/;
	return if /^testing::/;
	return if /^\(anonymous namespace\)::/;
	$blockOK = 1;
}

while(<>) {
	if (/^==\d+==\s*$/) {
		print;
		endBlock;
	} elsif (/^==\d+==\s+\d+bytes.*lost in loss record/) {
		startBlock;
	} elsif ($block) {
		addToBlock;
	} else {
		print;
	}
}
endBlock;