Whamcloud - gitweb
land b_md onto HEAD:
[fs/lustre-release.git] / lustre / tests / leak_finder.pl
index 1a92327..fbf1d00 100644 (file)
@@ -1,19 +1,24 @@
 #!/usr/bin/perl -w
 
+use IO::Handle;
+
+STDOUT->autoflush(1);
+STDERR->autoflush(1);
+
 my ($line, $memory);
 my $debug_line = 0;
 
 while ($line = <>) {
     $debug_line++;
     my ($file, $func, $lno, $name, $size, $addr, $type);
-    if ($line =~ m/^.*\((.*):(\d+):(.*)\(\) \d+\+\d+\): [vk](.*) '(.*)': (\d+) at (.*) \(tot .*$/) {
+    if ($line =~ m/^.*\((.*):(\d+):(.*)\(\) (\d+ \| )?\d+\+\d+\): [vk](.*) '(.*)': (\d+) at (.*) \(tot .*$/) {
         $file = $1;
         $lno = $2;
         $func = $3;
-        $type = $4;
-        $name = $5;
-        $size = $6;
-        $addr = $7;
+        $type = $5;
+        $name = $6;
+        $size = $7;
+        $addr = $8;
         printf("%8s %6d bytes at %s called %s (%s:%s:%d)\n", $type, $size,
                $addr, $name, $file, $func, $lno);
     } else {
@@ -29,14 +34,14 @@ while ($line = <>) {
         $memory->{$addr}->{debug_line} = $debug_line;
     } else {
         if (!defined($memory->{$addr})) {
-            print "*** Free without malloc ($size bytes at $addr, $file:$func:$lno)\n";
+            print STDERR "*** Free without malloc ($size bytes at $addr, $file:$func:$lno)\n";
             next;
         }
         my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$addr};
 
         if ($memory->{$addr}->{size} != $size) {
-            print "*** Free different size ($memory->{$addr}->{size} alloced, $size freed).\n";
-            print "    malloc at $memory->{$addr}->{file}:$memory->{$addr}->{func}:$memory->{$addr}->{lno}, free at $file:$func:$lno\n";
+            print STDERR "*** Free different size ($memory->{$addr}->{size} alloced, $size freed).\n";
+            print STDERR "    malloc at $memory->{$addr}->{file}:$memory->{$addr}->{func}:$memory->{$addr}->{lno}, free at $file:$func:$lno\n";
             next;
         }
 
@@ -44,10 +49,15 @@ while ($line = <>) {
     }
 }
 
+# Sort leak output by allocation time
+my @sorted = sort {
+    return $memory->{$a}->{debug_line} <=> $memory->{$b}->{debug_line};
+} keys(%{$memory});
+
 my $key;
-foreach $key (keys(%{$memory})) {
+foreach $key (@sorted) {
     my ($oldname, $oldsize, $oldfile, $oldfunc, $oldlno) = $memory->{$key};
-    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";
+    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";
 }
 
 print "Done.\n";