Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Speicherleck im Indy Server!? (https://www.delphipraxis.net/70822-speicherleck-im-indy-server.html)

heri 5. Jun 2006 13:29


Speicherleck im Indy Server!?
 
Ich habe eine Applikation mit einem IndyServer, bei der mir der FastMM Speicherlöcher anzeigt.
Auf der Suche nach dem Fehler habe ich folgenden Code in IdThread.pas gefunden:

initialization
SetThreadName('Main'); {do not localize}
GThreadCount := TIdThreadSafeInteger.Create;

finalization
// This call hangs if not all threads have been properly destroyed.
// But without this, bad threads can often have worse results. Catch 22.
// TIdThread.WaitAllThreadsTerminated;

{$IFDEF IDFREEONFINAL}
//only enable this if you know your code exits thread-clean
Sys.FreeAndNil(GThreadCount);
{$ENDIF}


Nun ja - im initialization gibt's ein TIdThreadSafeInteger.Create, aber im finalization wird dies nur mit einem DebuggerSwitch freigegeben.
Hat das auch schon jemand entdeckt?

Was heisst denn ThreadClean? genügt ein {$DEFINE IDFREEONFINAL} und wo soll ich den am besten hintun?

guste 5. Jun 2006 14:06

Re: Speicherleck im Indy Server!?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Den Debugger Schalter stellt man in den Projektoptionen Tab Verzeichnisse/Bedingungen abschnitt Bedingungen ein. (siehe Anhang)

Ich kann den geposteten Code bei mir nicht finden. Welche Indy Version benutzt Du?

heri 5. Jun 2006 14:46

Re: Speicherleck im Indy Server!?
 
Hab's unter ..\Borland\BDS\4.0\source\Indy10\Core im File IdThread.pas (16.3 kB) gefunden.
Thx für deinen Tipp in den Projektoptionen - leider hat's aber nichts gebracht.
seltsam - werde weiterforschen

guste 5. Jun 2006 15:28

Re: Speicherleck im Indy Server!?
 
Ich habe bei mir Indy 9, daher konnte ich es nicht finden. Habe aber trotzdem mal in den Quellcode von Indy10 geguckt. Ich denke das dies nicht für Dein Speicherleck verantworlich ist. Die Instanz wird definitiv nur einmal erzeugt und die Freigabe erfolgt automatisch wenn Dein Programm ebenfalls die heiligen Hallen des RAM verlassen muss. Ich finde das nicht gefährlich oder verboten, da mit dieser Klasse überprüft werden soll ob alle Threads die mal erzeugt wurden auch wieder beendet sind. Den Compiler Schalter würde ich übrigens wieder ausschalten, da es im Destructor krachen könnte wenn ein Thread mal nicht beendet werden kann. (z.B. durch ein Deadlock)

Kannst Du denn der Meldung von FastMM vertrauen? (hoffe ich trete keinem auf die Füße :| )

heri 5. Jun 2006 17:20

Re: Speicherleck im Indy Server!?
 
Naja, ob "ich FastMM4 vertrauen kann", kann ich nicht beantworten. Ich habe noch zu wenig Erfahrung damit.

Ich weiss nur, wenn ich ein Testprojekt eröffne und folgende beiden Units in das Projektverzeichnis kopiere:
..\BDS\4.0\source\Indy10\System IdStack.pas
..\BDS\4.0\source\Indy10\Core IdThread.pas

diese anschliessend in das Projekt einbinde, zusätzlich in den Projektoptionen IDFREEONFINAL als Bedingung hinzufüge, wird kein Speicherleck mehr angezeigt!

Schon komisch, oder?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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