AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Speicherleck UIB + FB30

Ein Thema von idontknow · begonnen am 20. Sep 2023 · letzter Beitrag vom 22. Sep 2023
Antwort Antwort
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#1

Speicherleck UIB + FB30

  Alt 20. Sep 2023, 13:54
Datenbank: Firebird • Version: 3.0.11 • Zugriff über: UIB
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;
Oliver
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#2

AW: Speicherleck UIB + FB30

  Alt 20. Sep 2023, 16:18
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Speicherleck UIB + FB30

  Alt 20. Sep 2023, 16:42
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#4

AW: Speicherleck UIB + FB30

  Alt 20. Sep 2023, 16:51
Danke @Uwe für den Link.
Mit TUIBDataBase gibt es bei mir auch kein Speicherleck und TUIB ist sogar noch minimal schneller.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Speicherleck UIB + FB30

  Alt 20. Sep 2023, 16:58
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);
$2B or not $2B

Geändert von himitsu (20. Sep 2023 um 17:07 Uhr)
  Mit Zitat antworten Zitat
idontknow

Registriert seit: 21. Apr 2008
Ort: Schleswig-Holstein
60 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Speicherleck UIB + FB30

  Alt 21. Sep 2023, 17:12
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;
Oliver
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#7

AW: Speicherleck UIB + FB30

  Alt 22. Sep 2023, 10:00
Hallöle...
Zitat:
localhost
Professional?...warum dann nicht FireDAC?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Speicherleck UIB + FB30

  Alt 22. Sep 2023, 12:11
Hallöle...
Zitat:
localhost
Professional?...warum dann nicht FireDAC?
Da in Pro nur für lokale Datenbanken möglich.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#9

AW: Speicherleck UIB + FB30

  Alt 22. Sep 2023, 12:49
Klar doch. "localhost" geht mit Professional... oder nicht?
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:59 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz