Einzelnen Beitrag anzeigen

umpani

Registriert seit: 26. Nov 2007
Ort: Essen
3 Beitrδge
 
#1

Torrent Client - socket.sendstream mit Memory Leak

  Alt 22. Okt 2008, 22:21
Hallo zusammen,

ich habe versuche jetzt schon mehrere Tage lang ein Memory Leak herauszufinden. Aber nichts klappt bis jetzt.
Ich schreibe ein Programm, das mit anderen Torrent-Clients kommunizieren soll. Dafόr werden die einzelnen TCP-Packete in Stream bereitsgestellt und όber die Socket-komponente verschickt. Klappt auch alles. Allerdings verbraucht das Programm immer mehr Speicher. Mittels FastMM4 habe ich jetzt einige Problemstellen herausgefunden. Aber eine Lφsung habe ich noch nicht gefunden. Wenn ich όbrigens das Programm minimiere und wieder maximiere ist der unnφtige Speicherbereich wieder freigegeben (natόrlich nur um dann direkt wieder zu wachsen),

Hier ist z.B. ein Auszug aus der FastMM Log Datei. An der Stelle, die FastMM bezeichet, erstellt dasProgramm einen Torrent-Handshake und versendet diese zu einem TCPServer.
Code:
A memory block has been leaked. The size is: 8356

This block was allocated by thread 0xD18, and the stack trace (return addresses) at the time was:
402EE2 [system.pas][System][@GetMem][2648]
4241CF [classes.pas][Classes][TMemoryStream.SetCapacity][5591]
424335 [classes.pas][Classes][TMemoryStream.Write][5639]
4C698A [sendestreams.pas][sendestreams][get_handshake][45]
4C7C2C [peerconnect.pas][peerconnect][TPeerconnect.torrent_verbindung_aufbauen][467]
4C7B2D [peerconnect.pas][peerconnect][TPeerconnect.Execute][410]
42A985 [classes.pas][Classes][ThreadProc][9866]
404A7E [system.pas][System][ThreadWrapper][12127]
7C80B683 [Unknown function at GetModuleFileNameA]

The block is currently used for an object of class: Unknown

The allocation number is: 87562

Current memory dump of 256 bytes starting at pointer address 7FBE41F0:
13 42 69 74 54 6F 72 72 65 6E 74 20 70 72 6F 74 6F 63 6F 6C 00 00 00 00 00 00 00 00 87 69 7F 14
D6 F5 33 9C BC FE 57 70 E3 50 0D 5D 0B 7D 8C FB 41 5A 32 35 30 30 42 54 30 30 30 30 30 30 30 30
30 30 30 30 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80 80
. B i t T o r r e n t    p r o t o c o l . . . . . . . . ‡  i   .
Φ  υ  3  ΅  Ÿ  ώ  W p γ  P . ] . }  ©  ϋ  A Z 2  5  0  0  B T 0  0  0  0  0  0  0  0
0  0  0  0  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
€  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €  €
Der dazugehφrige Delphi-Code:

Delphi-Quellcode:
  try
     torrent.peers.peerliste[peernr].client.Socket.SendStream(get_handshake(torrent));
  finally
  ...
  end;
Delphi-Quellcode:
function get_handshake(input:ttorrent):tstream;
  var
      pstrlen:byte;
      pstr:string;
      reserved:integer;
      infohashhex:string[40];
      infohash:array[1..20] of byte;
      peer_id:string[20];
      i,int:integer;
      s:string;

begin
  result := tmemorystream.create;
  infohashhex := input.infohashhex;
  infohashhex := uppercase(infohashhex);
  for i := 1 to 20 do
    begin
      s := '';
      s := s + infohashhex[i*2-1];
      s := s + infohashhex[i*2];
      infohash [i] := hextoint(s);
    end;

    pstrlen := 19;
    result.Write(pstrlen,1);
    pstr := 'BitTorrent protocol';

    schreibe_string_in_stream(result,pstr);

    reserved := 0;
    result.Write(reserved,sizeof(reserved));
    result.Write(reserved,sizeof(reserved));

    result.Write(infohash,20);

    peer_id := 'AZ2500BT000000000000';
    schreibe_string_in_stream(result,peer_id);

    result.Seek(0,soFromBeginning);
end;
In den Delphihilfen steht, das "socket.sendstream" den όbegebenen Stream selbst freigibt. Eine eigenhδndige Freigabe verursacht eine exception.

Wie gesagt, von der Funktion her funktionieren der Code einwandfrei.

Ich hoffe ihr kφnnt mir weiterhelfen.

Gruί Umpani
  Mit Zitat antworten Zitat