Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Speicherleck UIB + FB30 (https://www.delphipraxis.net/213754-speicherleck-uib-fb30.html)

idontknow 20. Sep 2023 13:54

Datenbank: Firebird • Version: 3.0.11 • Zugriff über: UIB

Speicherleck UIB + FB30
 
Moin,

hatte gerade ein übelst zu findendes Speicherleck in einer Anwendung. Die Ausgaben von FastMM4 sahen nicht nach einem Speicherleck aus, der Process Explorer und auch der Task-Manager waren anderer Meinung.
Konnte das ganze nun auf UIB in Verbindung mit Firebird 3.0 eingrenzen (mit Firebird 2.5 gibt es das Problem anscheinend nicht).

Habe jetzt erstmal einen Workaround gebaut, indem ich die Verbindung zur Datenbank die ganze Zeit geöffnet halte, somit ist das kein akutes Problem mehr.

Jeder Connect/Disconnect zur Datenbank belegt etwa 420 Bytes, was bei mir nach einiger Server-Laufzeit eine ordentliche Menge ergab...

Der Speicher wird offenbar in der DLL angefordert, somit ausserhalb der Zuständigkeit von FastMM4.

Kann das jemand bestätigen? Taucht das Problem nur mit UIB auf, oder auch mit anderen DB-Komponenten?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Database: TUIBDataBase;
  i: Integer;
begin
  Database := TUIBDataBase.Create;
  try
    Database.LibraryName := 'fbclient.dll';
    Database.DatabaseName:= 'localhost/3050:database.fdb';
    Database.UserName := 'SYSDBA';
    Database.PassWord := 'masterkey';
    DataBase.CharacterSet := csUTF8;

    sleep(5000);

    for i := 1 to 1000 do // dauert etwa 30s, führt zu etwa 420kb Leck (100000x -> Leck 42MB)
    begin
      DataBase.Connected := TRUE;
      Database.Connected := FALSE;
    end;

  finally
    Database.Free;
  end;
end;

BerndS 20. Sep 2023 16:18

AW: Speicherleck UIB + FB30
 
TUIBDataBase kenne ich nicht, aber ich habe das mal mit der alten TFIBDatabase getestet und kommt kein Speicherleck.
Welche Version von FB3 hast du im Einsatz? Ich habe die letzte Firebird 3.0.11 installiert.

Uwe Raabe 20. Sep 2023 16:42

AW: Speicherleck UIB + FB30
 
Vielleicht habe ich auch nicht die richtige Stelle gefunden, aber hier ist das letzte Commit 7 Jahre her. Für in sich geschlossene Libraries mag das noch gehen, aber bei externen Abhängigkeiten zu Datenbanktreibern halte ich das für nicht akzeptabel.

BerndS 20. Sep 2023 16:51

AW: Speicherleck UIB + FB30
 
Danke @Uwe für den Link.
Mit TUIBDataBase gibt es bei mir auch kein Speicherleck und TUIB ist sogar noch minimal schneller.

himitsu 20. Sep 2023 16:58

AW: Speicherleck UIB + FB30
 
https://github.com/hgourvest/uib/network
Es gibt ein paar fortgeführte Forks (nur noch 2 Jahre alt)

Du nutzt eine uralte Interbase-Komponente, um auf eine nahezu aktuelle Firebird-Datenbank zuzugreifen.
Es gibt aktuellere Komponenten direkt für Firebird, aber z.B. auch universelleres ala FireDAC oder UniDAC können auf Firebird zugreifen.
joar



Ein Speicherleck ist, wenn etwas bei Programmende noch nicht freigegeben ist. (jedenfalls so, wie FastMM es standardmäßig prüft)

Packe mal einen der beiden Schleifen in einen Button
Delphi-Quellcode:
// Speicherleck
for i := 0 to 1000000 do
  TRichEdit.Create(nil);

// kein Speicherleck (jedenfalls kein "Echtes", da sich doch jemand um die Freigabe kümmert)
for i := 0 to 1000000 do
  TRichEdit.Create(Self);

idontknow 21. Sep 2023 17:12

AW: Speicherleck UIB + FB30
 
Ich benutze 3.0.11.37703, war aber mit 3.0.10.x dasselbe Problem.

Das zwei jahre alte Repo habe ich eben auch ausprobiert, da hat sich aber nix geändert...

Das habe ich vielleicht missverständlich ausgedrückt: Es gibt kein Speicherleck in dem Sinne, das FastMM beim Beenden etwas zu reporten hätte.

Letztlich werden aber immer mehr "Private Bytes" belegt (und nie wieder freigegeben), wenn abwechselnd isc_attach_database / isc_detach_database ausgeführt wird.

Ich habe jetzt mal in TUIBDatabase eine TestLeak-Methode eingebaut, die auf das wesentliche reduziert ist...

Muss nach isc_attach_database und/oder isc_detach_database vielleicht noch irgendwas aufgeräumt werden?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Database: TUIBDataBase;
  i: Integer;
begin
  Database := TUIBDataBase.Create;
  try
    Database.LibraryName := 'fbclient.dll'; // Version 3.0.11.33703, installierter Server ebenfalls...
    Database.DatabaseName:= 'localhost/3050:database.fdb';
    Database.UserName := 'SYSDBA';
    Database.PassWord := 'masterkey';
    DataBase.CharacterSet := csUTF8;

    sleep(5000);

    DataBase.Connected := TRUE;
    Database.Connected := FALSE;


    Database.TestLeak;

//    TestLeak macht letztlich 1000x in Folge AttachDatabase/DetachDatabase:
//    procedure TUIBDatabase.TestLeak;
//    var
//      i: Integer;
//    begin
//      for i := 1 to 1000 do
//      begin
//        FLibrary.AttachDatabase(AnsiString(FDatabaseName), FDbHandle, AnsiString(FParams.Text), BreakLine);
//        FLibrary.DetachDatabase(FDbHandle);
//      end;
//    end;
//
//    procedure TUIBLibrary.AttachDatabase(const FileName: RawByteString; var DbHandle: IscDbHandle;
//      Params: AnsiString; Sep: AnsiChar = ';');
//    begin
//      Params := CreateDBParams(Params, Sep);
//      CheckUIBApiCall(isc_attach_database(@FStatusVector, Length(FileName), Pointer(FileName),
//        @DBHandle, Length(Params), PAnsiChar(Params)));
//    end;
//
//    procedure TUIBLibrary.DetachDatabase(var DBHandle: IscDbHandle);
//    begin
//      CheckUIBApiCall(isc_detach_database(@FStatusVector, @DBHandle));
//      // if connection lost DBHandle must be set manually to nil.
//      DBHandle := nil;
//    end;

  finally
    Database.Free;
  end;
end;

haentschman 22. Sep 2023 10:00

AW: Speicherleck UIB + FB30
 
Hallöle...8-)
Zitat:

localhost
Professional?...warum dann nicht FireDAC?

mkinzler 22. Sep 2023 12:11

AW: Speicherleck UIB + FB30
 
Zitat:

Zitat von haentschman (Beitrag 1527203)
Hallöle...8-)
Zitat:

localhost
Professional?...warum dann nicht FireDAC?

Da in Pro nur für lokale Datenbanken möglich.

haentschman 22. Sep 2023 12:49

AW: Speicherleck UIB + FB30
 
Klar doch. "localhost" geht mit Professional...:wink: oder nicht?


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz