Whamcloud - gitweb
land b_md onto HEAD:
[fs/lustre-release.git] / lustre / tests / leak_finder.pl
1 #!/usr/bin/perl -w
2
3 use IO::Handle;
4
5 STDOUT->autoflush(1);
6 STDERR->autoflush(1);
7
8 my ($line, $memory);
9 my $debug_line = 0;
10
11 while ($line = <>) {
12     $debug_line++;
13     my ($file, $func, $lno, $name, $size, $addr, $type);
14     if ($line =~ m/^.*\((.*):(\d+):(.*)\(\) (\d+ \| )?\d+\+\d+\): [vk](.*) '(.*)': (\d+) at (.*) \(tot .*$/) {
15         $file = $1;
16         $lno = $2;
17         $func = $3;
18         $type = $5;
19         $name = $6;
20         $size = $7;
21         $addr = $8;
22         printf("%8s %6d bytes at %s called %s (%s:%s:%d)\n", $type, $size,
23                $addr, $name, $file, $func, $lno);
24     } else {
25         next;
26     }
27
28     if ($type eq 'malloced') {
29         $memory->{$addr}->{name} = $name;
30         $memory->{$addr}->{size} = $size;
31         $memory->{$addr}->{file} = $file;
32         $memory->{$addr}->{func} = $func;
33         $memory->{$addr}->{lno} = $lno;
34         $memory->{$addr}->{debug_line} = $debug_line;
35     } else {
36         if (!defined($memory->{$addr})) {
37             print STDERR "*** Free without malloc ($size bytes at $addr, $file:$func:$lno)\n";
38             next;
39         }
40         my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$addr};
41
42         if ($memory->{$addr}->{size} != $size) {
43             print STDERR "*** Free different size ($memory->{$addr}->{size} alloced, $size freed).\n";
44             print STDERR "    malloc at $memory->{$addr}->{file}:$memory->{$addr}->{func}:$memory->{$addr}->{lno}, free at $file:$func:$lno\n";
45             next;
46         }
47
48         delete $memory->{$addr};
49     }
50 }
51
52 # Sort leak output by allocation time
53 my @sorted = sort {
54     return $memory->{$a}->{debug_line} <=> $memory->{$b}->{debug_line};
55 } keys(%{$memory});
56
57 my $key;
58 foreach $key (@sorted) {
59     my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$key};
60     print STDERR "*** Leak: $memory->{$key}->{size} bytes allocated at $key ($memory->{$key}->{file}:$memory->{$key}->{func}:$memory->{$key}->{lno}, debug file line $memory->{$key}->{debug_line})\n";
61 }
62
63 print "Done.\n";