|
Posted by jm on March 29, 2008, 7:40 pm
Please log in for more thread options
jm a écrit :
>
> Modifying a little bit again the script, and checking execution with
> ltrace, I observed malloc is called 1871 times when free is just called
> 922 times.
> Isn't it an issue?
>
> and did:
ltrace perl essai.pl 2>&1 | grep 'malloc\|free\|realloc' | perl
observe_malloc_free.pl > memory.log
with observe_malloc_free.pl in mail bottom.
Hereafter, this result of memory leaks:
1 NULL is freed, but thats not a memory leak!
the rest can be read like this:
7 10 Mbytes data are not freed.
1 13 Mbytes data is not freed
8272 4 bytes data are not freed
9843 4080 bytes data are not freed
but I still do not know why...
/tmp$ cat memory.log | sed 's/.*=>//g' | sort | uniq -c
7 10
10 100
7 10000004
22 11
4 112
10 116
1 1192
26 12
1 124
4 128
12 13
1 131716
1 13334528
13 14
3 140
6 15
28 16
9 17
14 18
8 19
19 2
14 20
1 2048
6 21
5 22
3 23
230 24
1 240
6 25
7 256
4 27
1 2712
143 28
4 3
2 30
1 31
125 32
2 33
2 34
1 36
8272 4
3 40
1 4048
1 4064
9843 4080
8 4096
2 4373
1 44
1 45
78 48
1 49156
2 496
72 5
1 50
1 512
65 52
50 56
1 58
6 6
1 628
1 635
13 64
18 7
1 76
45 8
1 80
1 8080
2 84
4 88
74 9
1 98
1 freeing not allocated memory : NULL :
>> --- scipt ---------------------------
>> sub aa($)
>> {
>> my ($d) = @_;
>> $$d =~ s/x(.....)/$1y/g ;
>> $$d =~ s/x(.....)/$1z/g ;
>> $$d =~ s/x(.....)/$1a/g ;
>> $$d =~ s/x(.....)/$1b/g ;
>> $$d =~ s/x(.....)/$1c/g ;
>> return $d;
>> }
>>
>> sub ab($)
>> {
>> my ($d) = @_;
>> $$d =~ s/a(.....)/$1y/g ;
>> $$d =~ s/b(.....)/$1z/g ;
>> $$d =~ s/c(.....)/$1a/g ;
>> $$d =~ s/y(.....)/$1b/g ;
>> $$d =~ s/z(.....)/$1c/g ;
>> return $d;
>> }
>>
>>
>> my $s= 'x' x (1000*1000*10) ;
>> $s .= "\x" ;
>> my $c = $s;
>> print length($$c) ."\n" ;
>> my $v = qx( ps v $$ );
>> print "$v\n" ;
>> $c = aa($c);
>> print length($$c) ."\n" ;
>> my $v = qx( ps v $$ );
>> print "$v\n" ;
>> $c = aa($c);
>> $c = aa($c);
>> $c = aa($c);
>> $c = aa($c);
>> $c = aa($c);
>> print length($$c) ."\n" ;
>> my $v = qx( ps v $$ );
>> print "$v\n" ;
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> print length($$c) ."\n" ;
>> my $v = qx( ps v $$ );
>> print "$v\n" ;
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> $c = ab($c);
>> print length($$c) ."\n" ;
>> my $v = qx( ps v $$ );
>> print "$v\n" ;
-- observe...pl --------------------------
my %hash = ();
while (<>)
{
my $line = $_;
#print "jmg:" . $line;
if ( $line =~ m/malloc\(([0-9]*)\).*= *([0-9xa-fNUL]*)/ )
{
my $size = $1;
my $ad = $2;
#print "malloc : $1 : $2 : \n" ;
if ( defined ( $hash) )
{
print "redundant malloc : $1 : $2 : \n" ;
}
$hash = $size;
}
elsif ( $line =~ m/realloc\(([0-9xa-fNUL]*) *, *([0-9]*)\).*=
*([0-9xa-fNUL]*)/ )
{
my $adp = $1;
my $size = $2;
my $ad = $3;
if ( not defined ( $hash) )
{
print "realloc not allocated memory : $adp : \n" ;
}
delete $hash ;
#print "malloc : $1 : $2 : \n" ;
if ( defined ( $hash) )
{
print "redundant malloc : $size : $ad : \n" ;
}
$hash = $size;
}
elsif ( $line =~ m/free\(([0-9xa-fNUL]*)/ )
{
my $ad = $1;
#print "free : $1 : \n" ;
if ( not defined ( $hash) )
{
print "freeing not allocated memory : $1 : \n" ;
}
delete $hash ;
}
else
{
print "???:" . $line;
}
}
foreach my $key ( keys ( %hash) )
{
print $key . ' => ' . $hash . "\n" ;
}
|