diff options
author | Sage Weil <sage@newdream.net> | 2009-12-03 15:54:24 -0800 |
---|---|---|
committer | Sage Weil <sage@newdream.net> | 2009-12-03 16:21:10 -0800 |
commit | a4257d87829e20337edbbf8cd9d3c528fd3e6568 (patch) | |
tree | a3066ed33798f10494b7f39bab898bb0449001ea /src/script | |
parent | 25e8202f69969711cbd4d55a761169ae2b6d57a3 (diff) | |
download | ceph-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-x | src/script/find_bufferleaks.pl | 75 |
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}"; } |