summaryrefslogtreecommitdiff
path: root/src/script
diff options
context:
space:
mode:
authorSage Weil <sage@newdream.net>2009-12-03 15:54:24 -0800
committerSage Weil <sage@newdream.net>2009-12-03 16:21:10 -0800
commita4257d87829e20337edbbf8cd9d3c528fd3e6568 (patch)
treea3066ed33798f10494b7f39bab898bb0449001ea /src/script
parent25e8202f69969711cbd4d55a761169ae2b6d57a3 (diff)
downloadceph-a4257d87829e20337edbbf8cd9d3c528fd3e6568.tar.gz
buffer: optional buffer debug output
This interferes with the dout crap because we can't #include it, so you need to turn all that output off to avoid getting jumbled output. Or better yet make sure you don't daemon() but still log dout to a file. Fixed up the output parser to find leaks.
Diffstat (limited to 'src/script')
-rwxr-xr-xsrc/script/find_bufferleaks.pl75
1 files changed, 15 insertions, 60 deletions
diff --git a/src/script/find_bufferleaks.pl b/src/script/find_bufferleaks.pl
index 152515d5e78..55abc720d60 100755
--- a/src/script/find_bufferleaks.pl
+++ b/src/script/find_bufferleaks.pl
@@ -2,68 +2,23 @@
use strict;
my %buffers;
-my %bufferlists;
-my %ref;
-my %mal;
+
my $l = 1;
while (<>) {
- #print "$l: $_";
-
- # cinode:auth_pin on inode [1000000002625 /gnu/blah_client_created. 0x89b7700] count now 1 + 0
-
- if (/^buffer\.cons /) {
- my ($x) = /(0x\S+)/;
- $buffers{$x} = 1;
- }
- if (/^buffer\.des /) {
- my ($x) = /(0x\S+)/;
- die "des without cons at $l: $_" unless $buffers{$x};
- delete $buffers{$x};
- die "des with ref>0 at $l: $_" unless $ref{$x} == 0;
- delete $ref{$x};
- }
-
- if (/^bufferlist\.cons /) {
- my ($x) = /(0x\S+)/;
- $bufferlists{$x} = 1;
- }
- if (/^bufferlist\.des /) {
- my ($x) = /(0x\S+)/;
- warn "des without cons at $l: $_" unless $bufferlists{$x};
- delete $bufferlists{$x};
- }
-
-
- if (/^buffer\.malloc /) {
- my ($x) = /(0x\S+)/;
- $mal{$x} = 1;
- }
- if (/^buffer\.free /) {
- my ($x) = /(0x\S+)/;
- die "free with malloc at $l: $_" unless $mal{$x};
- delete $mal{$x};
- }
-
- if (/^buffer\.get /) {
- my ($x) = /(0x\S+)/;
- $ref{$x}++;
- }
- if (/^buffer\.get /) {
- my ($x) = /(0x\S+)/;
- $ref{$x}--;
- }
-
-$l++;
-}
-
-for my $x (keys %bufferlists) {
- print "leaked bufferlist $x\n";
-}
-
-for my $x (keys %buffers) {
- print "leaked buffer $x ref $ref{$x}\n";
+ #print "$l: $_";
+
+ if (/^raw_(\w+) alloc (\S+)/) {
+ #print "alloc $2\n";
+ $buffers{$2} = "$l: $_";
+ }
+ if (/^raw_(\w+) free (\S+)/) {
+ #print "free $2\n";
+ print "free without alloc at $l: $_" unless $buffers{$2};
+ delete $buffers{$2};
+ }
+ $l++;
}
-for my $x (keys %mal) {
- print "leaked buffer dataptr $x ref $ref{$x}\n";
+for my $x (sort {$buffers{$a} <=> $buffers{$b}} keys %buffers) {
+ print "leaked $buffers{$x}";
}