Avatar billede Swift Praktikant
15. august 2002 - 12:40 Der er 6 kommentarer og
1 løsning

Find en MEM leak!!

Jeg har en MEM leak - kan du finde den??
Jeg regner med at det er min socket forbindelse der ikke bliver frigivet.
-------------------------------------------
#!/usr/bin/perl

use IO::Socket::INET;
my $server_addr = 'xxx.xxx.xxx.xxx';

while( true )
{
    &DoSomething( $server_addr );
    print "Done!\n";
    sleep 1;
}


sub DoSomething
{
    my $remote_addr;
    my $serversocket;
    my $remote_addr = $_[0];
    $serversocket = IO::Socket::INET->new( PeerAddr => $remote_addr,
                                            PeerPort => '5000',
                                            Proto =>    'tcp',
                                            Type =>    SOCK_STREAM );
    print $serversocket "MSG1\n";
    if( <$serversocket> eq "RESP1!\n" )
    {
        print $serversocket "MSG2!\n";
        if( <$serversocket> eq "RESP2!\n" )
        {
            print "SVAR MODTAGET!\n";

        }
    }
    close( $serversocket )
}
Avatar billede jespernaur Nybegynder
15. august 2002 - 22:32 #1
Nu har jeg kørt din kode op mod en rudimentær port 5000 server - jeg har ladet den
køre rundt mere end 50000 gange (jeg fjernede sleep for ikke at dø af kedsomhed!). Jeg ser
ingen tegn på memory leak, så hvad får dig til at tro, at du har en, og at den ligger
i den kode, du har vist?

(jeg bør nok nævne, at jeg har kørt din kode på en Windows98 PC med activestate perl
5_005_03 build 522, hvilken platform/version bruger du?).

Mvh
Jesper Naur
Avatar billede jespernaur Nybegynder
15. august 2002 - 22:32 #2
Undskyld, det skulle ikke have været et svar
Avatar billede Swift Praktikant
16. august 2002 - 09:32 #3
Hm...det var underligt!!

Jeg bruger: Perl v5.8.0 built for i386-freebsd

Når jeg sidder og holder øje med TOP kan jeg se at der for hver kørsel af "DoSomething" snupper processen 36KB ekstra!
Avatar billede jespernaur Nybegynder
16. august 2002 - 20:09 #4
Det lyder for mig som om du bør fejlrapportere din perl - du kan helt sikkert i den medfølgende dokumentation finde information omkring hvordan dette sker.

Inden du afsender fejlrapporten, bør du forenkle dit program yderligere, så der kun er tale om at sende en tekst og modtage og udskrive svaret, altså absolut ingen logik.

Hvis du er ambitiøs og virkelig vil gøre noget ud af det, kunne du prøve at implementere det samme i C, for at demonstrere at problemet ikke ligger i operativsystemet.

For fuldstændighedens skyld får du det, jeg har kørt med - jeg var nødt til at
lave et par smårettelser, herunder et par fejlcheck:

#!/usr/bin/perl

#use IO::Socket::INET;
use IO::Socket;
my $server_addr = 'xxx.xxx.xxx.xxx';
my $num = 0;

while( true )
{
    &DoSomething( $server_addr );
    $num++;
    print "Done $num!\n";
    #sleep 1;
}


sub DoSomething
{
    my $remote_addr;
    my $serversocket;
    my $remote_addr = $_[0];
    my $buf;
    $serversocket = IO::Socket::INET->new( PeerAddr => $remote_addr,
                                            PeerPort => '5000',
                                            Proto =>    'tcp',
                                            Type =>    SOCK_STREAM );
    die "Socket could not be created. Reason: $!\n" unless $serversocket;
    print $serversocket "MSG1\n";
    $buf = <$serversocket>;
    print "\$buf = <$buf>\n";
    if( $buf eq "RESP1!\n" )
    {
        print $serversocket "MSG2!\n";
        if( <$serversocket> eq "RESP2!\n" )
        {
            print "SVAR MODTAGET!\n";

        }
    }
    close( $serversocket )
}

Mvh
Jesper Naur
Avatar billede Swift Praktikant
26. august 2002 - 10:23 #5
Jeg har lige lavet en SPARE version af koden.
Der er stadig en MEM leak.
Du siger jeg skal fejlrapportere min perl - ved du til hvem??


SERVER: (OK)
-----------------------------------------------------------
#!/usr/bin/perl

use strict;
use IO::Socket::INET;
my $serverSocket;
$serverSocket = IO::Socket::INET->new( LocalPort => 5000, Type => SOCK_STREAM, Reuse => 1, Listen => 'SOMAXCON' );
while( true )
{
    my $clientSocket;
    $clientSocket = $serverSocket -> accept();
    print "Client connection accepted!\n";
    if( <$clientSocket> eq "A\n" )
    {
        print "I'm sending B\n";
        print $clientSocket "B\n";
    }
    sleep 2;
    close( $clientSocket );
    print "Client connection closed!\n";
}
close( $serverSocket );
###########################################################


CLIENT: (MEM LEAK)
-----------------------------------------------------------
#!/usr/bin/perl

use strict;
use IO::Socket::INET;
my $clientsocket;
while( true )
{
    $clientsocket = IO::Socket::INET->new( PeerAddr => '127.0.0.1', PeerPort => '5000', Proto => 'tcp', Type => SOCK_STREAM );
    print $clientsocket "A\n";
    if( <$clientsocket> eq "B\n" )
    {
        print "I received B\n";
    }
    close( $clientsocket );
    sleep 5;
}
###########################################################
Avatar billede jespernaur Nybegynder
26. august 2002 - 17:46 #6
Som jeg nævnte ovenfor, burde du kunne finde ud af dette ved at studere den dokumentation, der følger med perl - så vidt jeg ved handler det om at skrive en udførlig fejlbeskrivelse og sende den til

    perlbug@perl.org

Der er et særligt hjælpeprogram 'perlbug' som kan assistere ved udarbejdelsen. Det kan også anbefales at du kigger dig omkring i

    http://www.cpan.org

der er meget godt at finde.
Avatar billede Swift Praktikant
27. august 2002 - 11:01 #7
Takker for hjælpen. Jeg har smidt en mail afsted til folkene bag perl... så må vi se hvad der sker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester