Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Memory Leak bei INDY 10 in der SMTP Komponente? (https://www.delphipraxis.net/76066-memory-leak-bei-indy-10-der-smtp-komponente.html)

emsländer 29. Aug 2006 12:43


Memory Leak bei INDY 10 in der SMTP Komponente?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin,

man nehme eine leere Form. Die erste Anweisung beim Start sollte der Aufruf des MemoryManagers sein:

Delphi-Quellcode:
program test;

uses
  Forms,
  main in 'main.pas' {frmmain};

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(Tfrmmain, frmmain);
  Application.Run;
end.
Auf die Mainform ziehe man aus IndyClients die SMTP Komponente.

Compilieren, starten, beenden ..... => Meldung siehe Anhang


Gruss

EL

xaromz 29. Aug 2006 12:50

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,

das ist ein bekanntes Problem. in den INDYs wird irgendwo eine TIdCriticalScetion angelegt und nicht mehr freigegeben. Das ist sogar im Quellcode so vermerkt. Da steht sinngemäß: "Da wir nicht wissen, ob das Objekt später noch verwendet wird, lassen wir es leben und von Windows wegräumen, wenn das Programm beendet wird."

Gruß
xaromz

emsländer 29. Aug 2006 12:51

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,

das ist ein bekanntes Problem. in den INDYs wird irgendwo eine TIdCriticalScetion angelegt und nicht mehr freigegeben. Das ist sogar im Quellcode so vermerkt. Da steht sinngemäß: "Da wir nicht wissen, ob das Objekt später noch verwendet wird, lassen wir es leben und von Windows wegräumen, wenn das Programm beendet wird."

Gruß
xaromz

Da mein Programm ein Dienst wird, wird das Ding nie beendet *grusel*


Gruss

Jörg

xaromz 29. Aug 2006 12:53

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von emsländer
Da mein Programm ein Dienst wird, wird das Ding nie beendet *grusel*

Wieso nicht :gruebel: ?

Gruß
xaromz

emsländer 29. Aug 2006 12:57

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
Da mein Programm ein Dienst wird, wird das Ding nie beendet *grusel*

Wieso nicht :gruebel: ?

Gruß
xaromz

Läuft auf nem Server ..... und den schaltet man nicht mal so eben aus.


Gruss

EL

xaromz 29. Aug 2006 13:00

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von emsländer
Läuft auf nem Server ..... und den schaltet man nicht mal so eben aus.

Und was stört Dich dann? Das Problem ist ja kein zyklischer Leak. Es wird nur beim Beenden des Programms ein Objekt nicht freigegeben, was an dieser Stelle aber eh schon egal ist. Das ist zwar kein schöner Programmierstil, ab die INDYs sind da sowieso etwas eigen.

Gruß
xaromz

supermuckl 29. Aug 2006 13:04

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
@emsländer

womit hast du diese leak meldung hinbekommen? sowas brauch ich auch :)

emsländer 29. Aug 2006 13:08

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von supermuckl
@emsländer

womit hast du diese leak meldung hinbekommen? sowas brauch ich auch :)

siehe im Anfang. In die erste Zeile Deines Projektes
Delphi-Quellcode:
ReportMemoryLeaksOnShutdown := True;
Beispiel:
Delphi-Quellcode:
program test;

uses
  Forms,
  main in 'main.pas' {frmmain};

{$R *.res} 

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.CreateForm(Tfrmmain, frmmain);
  Application.Run;
end.
Gruss

EL

xaromz 29. Aug 2006 13:08

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von supermuckl
womit hast du diese leak meldung hinbekommen? sowas brauch ich auch :)

Das ist eine Meldung vom Memorymanager FastMEMFastMM, welcher in Delphi 2006 eingebaut ist. Für Delphi 6 musst Du Dir die Komponente runterladen. Einfach in Google suchen.

Gruß
xaromz

emsländer 29. Aug 2006 13:09

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
Läuft auf nem Server ..... und den schaltet man nicht mal so eben aus.

Und was stört Dich dann? Das Problem ist ja kein zyklischer Leak. Es wird nur beim Beenden des Programms ein Objekt nicht freigegeben, was an dieser Stelle aber eh schon egal ist. Das ist zwar kein schöner Programmierstil, ab die INDYs sind da sowieso etwas eigen.

Gruß
xaromz

Ich HASSE Leaks in einem Produktivsystem

Gruss

EL

xaromz 29. Aug 2006 13:12

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von emsländer
Ich HASSE Leaks in einem Produktivsystem

Tja, in diesem Fall gilt: Friss oder stirb. Die INDYs sind nun mal so geschrieben. Du kannst ja versuchen, den Leak zu stopfen, aber das könnte wohl Seiteneffekte mit sich bringen.

Gruß
xaromz

emsländer 29. Aug 2006 13:20

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
Ich HASSE Leaks in einem Produktivsystem

Tja, in diesem Fall gilt: Friss oder stirb. Die INDYs sind nun mal so geschrieben. Du kannst ja versuchen, den Leak zu stopfen, aber das könnte wohl Seiteneffekte mit sich bringen.

Gruß
xaromz

Ich werds beobachten .....


Gruss

EL

himitsu 29. Aug 2006 13:21

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Das ist eine Meldung vom Memorymanager FastMEM, welcher in Delphi 2006 eingebaut ist.

FastMM (dazu gibt's auch massig hier in der DP :roll: )

markusj 29. Aug 2006 13:33

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
oder MemCheck, welches dir bei eingeschalteten Debuginfos sogar die stelle Anzeigt, bei der das Leak entstanden ist, mitsamt dem kompletten Aufruf-Stack.

mfG

Markus

jbg 29. Aug 2006 16:28

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Tja, in diesem Fall gilt: Friss oder stirb. Die INDYs sind nun mal so geschrieben. Du kannst ja versuchen, den Leak zu stopfen, aber das könnte wohl Seiteneffekte mit sich bringen.

Also ich habe noch keinen Seiteneffekt gefunden, und diese CriticalSection wird bei mir freigegeben (Änderung am Quellcode vor fast einem Jahr), weil sie beim Entwickeln einfach nur stört.

xaromz 29. Aug 2006 17:12

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von jbg
Also ich habe noch keinen Seiteneffekt gefunden, und diese CriticalSection wird bei mir freigegeben (Änderung am Quellcode vor fast einem Jahr), weil sie beim Entwickeln einfach nur stört.

Mir fliegt dann ein Assertion Error um die Ohren. Aber das lässt sich einfach beheben.

Gruß
xaromz

emsländer 29. Aug 2006 17:16

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von jbg
Zitat:

Zitat von xaromz
Tja, in diesem Fall gilt: Friss oder stirb. Die INDYs sind nun mal so geschrieben. Du kannst ja versuchen, den Leak zu stopfen, aber das könnte wohl Seiteneffekte mit sich bringen.

Also ich habe noch keinen Seiteneffekt gefunden, und diese CriticalSection wird bei mir freigegeben (Änderung am Quellcode vor fast einem Jahr), weil sie beim Entwickeln einfach nur stört.

Kannst Du uns diese Änderung bitte mal mitteilen?


Gruss

EL

jbg 29. Aug 2006 17:32

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Datei IdComponent.pas
Delphi-Quellcode:
destructor TIdComponent.Destroy;
begin
  inherited Destroy;
  // After inherited - do at last possible moment
+ if Assigned(GStackCriticalSection) then
    GStackCriticalSection.Acquire;
  try
    Dec(GInstanceCount);
    if GInstanceCount = 0 then begin
      // This CS will guarantee that during the FreeAndNil nobody will try to use
      // or construct GStack
      FreeAndNil(GStack);
    end;
  finally
+   if Assigned(GStackCriticalSection) then
      GStackCriticalSection.Release;
  end;
end;

...

initialization
  GStackCriticalSection := TCriticalSection.Create;
finalization
- // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
- // tries to access it. App will kill it off anyways, so just let it leak
- // FreeAndNil(GStackCriticalSection);
+ FreeAndNil(GStackCriticalSection);
end.
Das die beim schreiben des Kommentars nicht gleich darauf gekommen sind :shock: Aber der Indy-Code ist sowieso etwas undurchsichtig (von der Formatierung mal abgesehen)

jbg 29. Aug 2006 17:36

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Ach ja und dann:

dcc32.exe -U..\..\lib -R..\..\lib -M -$D- IdComponent.pas
move IdComponent.dcu ..\..\lib

dcc32.exe -U..\..\lib -R..\..\lib -M -$D+ IdComponent.pas
move IdComponent.dcu ..\..\lib\debug

Das Indy-Package muss, wenn man es nutzt, auch neu gebaut werden.

emsländer 29. Aug 2006 17:54

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von jbg
Ach ja und dann:

dcc32.exe -U..\..\lib -R..\..\lib -M -$D- IdComponent.pas
move IdComponent.dcu ..\..\lib

dcc32.exe -U..\..\lib -R..\..\lib -M -$D+ IdComponent.pas
move IdComponent.dcu ..\..\lib\debug

Das Indy-Package muss, wenn man es nutzt, auch neu gebaut werden.

Das bringt mir beim Compilieren mit D2006 aber nur Fehler :?


Gruss

EL

xaromz 29. Aug 2006 18:16

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,

folgende Änderungen in der Datei idStack.pas sind notwendig, sonst kann es knallen (was ja der Grund für den Leak ist):
Nach Implementation:
Delphi-Quellcode:
var
  GInstanceCount: Integer = 0;
  GStackCriticalSection: TIdCriticalSection;
wird zu
Delphi-Quellcode:
var
  GInstanceCount: Integer = 0;
  GStackCriticalSection: TIdCriticalSection;
  GDestroying: Boolean; // Neue Variable
Die Methode TIdStack.DecUsage muss erweitert werden:
Delphi-Quellcode:
...
  finally GStackCriticalSection.Release; end;

  // Auf Destroying reagieren
  if (GInstanceCount = 0) and GDestroying then
    Sys.FreeAndNil(GStackCriticalSection);
end;
und am Ende:
Delphi-Quellcode:
finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
//Edit: Meine Lösung gilt für Version Version 10, jbg's für Version 9.
Gruß
xaromz

emsländer 29. Aug 2006 18:40

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hi,

Wenn ich das versuche zu compilieren (D2006/Indy10) dann bekomme ich die Fehlermeldung:
[Pascal Fataler Fehler] IndySystem.dpk(29): E2202 Package 'Borland.Delphi' wird benötigt, konnte aber nicht gefunden werden. Wo soll das denn stecken?



Gruss

EL

xaromz 29. Aug 2006 19:01

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von emsländer
Wenn ich das versuche zu compilieren (D2006/Indy10) dann bekomme ich die Fehlermeldung:
[Pascal Fataler Fehler] IndySystem.dpk(29): E2202 Package 'Borland.Delphi' wird benötigt, konnte aber nicht gefunden werden. Wo soll das denn stecken?

Den Fehler bekomme ich auch. Hört sich irgendwie nach .Net an :gruebel: . INDY 10 ist ja für beide Plattformen.
Lösung hab' ich leider keine. Ich habe einfach den Suchpfad meines Projekts angepasst und kompiliere die Units in meine Anwendung mit rein.

Gruß
xaromz

jbg 29. Aug 2006 19:15

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von emsländer
Wenn ich das versuche zu compilieren (D2006/Indy10) dann bekomme ich die Fehlermeldung:

Mir persönlich gefällt der Quellcode zu Indy 10 überhaupt nicht (deswegen keine Hilfe von mir). Anfangs habe ich da sogar mitentwickelt. Aber nachdem dann C# ohne die SysUtils, Classes, ... Units unterstützt werden sollte, und dafür dann der gesamte Code so umgemodelt wurde dass alles nur noch aus Zwichenschicht-Aufrufen bestand (die ausgetauscht werden können), wurde mir das ganze dann doch zu bunt. Und jetzt wo der gesamte Code (in meinen Augen) völlig unleserlich geworden ist, wurde dann doch ein Neustart für eine C# only Version (in C#) gestartet. So kann man auch ein Projekt kaputt machen.

emsländer 20. Sep 2006 08:05

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
Wenn ich das versuche zu compilieren (D2006/Indy10) dann bekomme ich die Fehlermeldung:
[Pascal Fataler Fehler] IndySystem.dpk(29): E2202 Package 'Borland.Delphi' wird benötigt, konnte aber nicht gefunden werden. Wo soll das denn stecken?

Den Fehler bekomme ich auch. Hört sich irgendwie nach .Net an :gruebel: . INDY 10 ist ja für beide Plattformen.
Lösung hab' ich leider keine. Ich habe einfach den Suchpfad meines Projekts angepasst und kompiliere die Units in meine Anwendung mit rein.

Gruß
xaromz

Ich stell mich jetzt mal blöd :gruebel:

Wie?


Gruss

EL

emsländer 20. Sep 2006 08:12

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
und am Ende:
Delphi-Quellcode:
finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
//Edit: Meine Lösung gilt für Version Version 10, jbg's für Version 9.
Gruß
xaromz

muss ich den Teil:
Delphi-Quellcode:
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}
behalten, oder ersetzen?


Gruss

EL

xaromz 20. Sep 2006 08:40

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Hallo,
Zitat:

Zitat von emsländer
muss ich den Teil:
Delphi-Quellcode:
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}
behalten, oder ersetzen?

Ersetzen:
Delphi-Quellcode:
initialization
  GDestroying := False;
  GStackClass :=
   {$IFDEF LINUX}     TIdStackLinux;  {$ENDIF}
   {$IFDEF MSWINDOWS} TIdStackWindows; {$ENDIF}
   {$IFDEF DOTNET}    TIdStackDotNet; {$ENDIF}
  GStackCriticalSection := TIdCriticalSection.Create;

finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
end.
Gruß
xaromz

emsländer 20. Sep 2006 08:45

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
muss ich den Teil:
Delphi-Quellcode:
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}
behalten, oder ersetzen?

Ersetzen:
Delphi-Quellcode:
initialization
  GDestroying := False;
  GStackClass :=
   {$IFDEF LINUX}     TIdStackLinux;  {$ENDIF}
   {$IFDEF MSWINDOWS} TIdStackWindows; {$ENDIF}
   {$IFDEF DOTNET}    TIdStackDotNet; {$ENDIF}
  GStackCriticalSection := TIdCriticalSection.Create;

finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
end.
Gruß
xaromz

tx

und wie nun compilieren?

Gruss

EL

emsländer 20. Sep 2006 12:17

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
Zitat:

Zitat von emsländer
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
muss ich den Teil:
Delphi-Quellcode:
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}
behalten, oder ersetzen?

Ersetzen:
Delphi-Quellcode:
initialization
  GDestroying := False;
  GStackClass :=
   {$IFDEF LINUX}     TIdStackLinux;  {$ENDIF}
   {$IFDEF MSWINDOWS} TIdStackWindows; {$ENDIF}
   {$IFDEF DOTNET}    TIdStackDotNet; {$ENDIF}
  GStackCriticalSection := TIdCriticalSection.Create;

finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
end.
Gruß
xaromz

tx

und wie nun compilieren?

Gruss

EL

- push -

Wie muss ich nun verfahren, um die Indylib neu zu bauen?

Gruss

EL

emsländer 16. Okt 2006 15:04

Re: Memory Leak bei INDY 10 in der SMTP Komponente?
 
- ich pushe dieses Thema noch einmal, weil Borland einer Anfrage nicht nachkommt und auf den kostenpflichtigen Support verweist. -

Zitat:

Zitat von emsländer
Zitat:

Zitat von emsländer
Zitat:

Zitat von xaromz
Hallo,
Zitat:

Zitat von emsländer
muss ich den Teil:
Delphi-Quellcode:
  {$IFDEF IDFREEONFINAL}
  Sys.FreeAndNil(GStackCriticalSection);
  {$ENDIF}
behalten, oder ersetzen?

Ersetzen:
Delphi-Quellcode:
initialization
  GDestroying := False;
  GStackClass :=
   {$IFDEF LINUX}     TIdStackLinux;  {$ENDIF}
   {$IFDEF MSWINDOWS} TIdStackWindows; {$ENDIF}
   {$IFDEF DOTNET}    TIdStackDotNet; {$ENDIF}
  GStackCriticalSection := TIdCriticalSection.Create;

finalization
  GDestroying := True;
  if GInstanceCount = 0 then
    Sys.FreeAndNil(GStackCriticalSection);
end.
Gruß
xaromz

tx

und wie nun compilieren?

Gruss

EL


Wie muss ich nun verfahren, um die Indylib neu zu bauen?

Gruss

EL



Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 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-2025 by Thomas Breitkreuz