Whamcloud - gitweb
4290b62a8e9249197877200083641340a898e725
[fs/lustre-release.git] / lustre / tests / leak_finder.pl
1 #!/usr/bin/perl -w
2
3 my ($line, $memory);
4 my $debug_line = 0;
5
6 while ($line = <>) {
7     $debug_line++;
8     my ($file, $func, $lno, $name, $size, $addr, $type);
9     if ($line =~ m/^.*\((.*):(.*)\,l\. (\d+) .* k(.*) '(.*)': (\d+) at (.*) \(tot .*$/) {
10         $file = $1;
11         $func = $2;
12         $lno = $3;
13         $type = $4;
14         $name = $5;
15         $size = $6;
16         $addr = $7;
17         printf("%8s %6d bytes at %s called %s (%s:%s:%d)\n", $type, $size,
18                $addr, $name, $file, $func, $lno);
19     } else {
20         next;
21     }
22
23     if ($type eq 'malloced') {
24         $memory->{$addr}->{name} = $name;
25         $memory->{$addr}->{size} = $size;
26         $memory->{$addr}->{file} = $file;
27         $memory->{$addr}->{func} = $func;
28         $memory->{$addr}->{lno} = $lno;
29         $memory->{$addr}->{debug_line} = $debug_line;
30     } else {
31         if (!defined($memory->{$addr})) {
32             print "*** Free without malloc ($size bytes at $addr, $file:$func:$lno)\n";
33             next;
34         }
35         my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$addr};
36
37         if ($memory->{$addr}->{size} != $size) {
38             print "*** Free different size ($memory->{$addr}->{size} alloced, $size freed).\n";
39             print "    malloc at $memory->{$addr}->{file}:$memory->{$addr}->{func}:$memory->{$addr}->{lno}, free at $file:$func:$lno\n";
40             next;
41         }
42
43         delete $memory->{$addr};
44     }
45 }
46
47 my $key;
48 foreach $key (keys(%{$memory})) {
49     my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$key};
50     print "*** 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";
51 }
52
53 print "Done.\n";