Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unbenutzte Objekte erkennen (https://www.delphipraxis.net/120172-unbenutzte-objekte-erkennen.html)

bernie110 6. Sep 2008 18:11


Unbenutzte Objekte erkennen
 
Hallo,
ich habe ein generelles Problem, für das ich noch keine Lösung gefunden habe :(
Und zwar habe ich ein "großes" Programm geschrieben, das innerhalb einer Schleife viele Objekte erzeugt und auch die meisten wieder freigibt - die meisten, aber nicht alle! Das sehe ich daran, dass nach jedem Schleifendurchlauf der Speicher, den das Programm belegt, größer wird.

Nun möchte ich gerne wissen, welche Objekte ich vergessen habe freizugeben, so dass sie am Ende der Schleife noch belegt sind. Das im Programmcode durchzuforsten und für alle Programmzweige zu untersuchen, erscheint mir zu aufwendig.

Da ich mit der Suchfunktion hier noch kein Ergebnis bekam, stelle ich hier nun meine Frage:
Gibt es eine Möglichkeit, sich entweder in der Borland-IDE oder per Programmcode solche eigenen erzeugten und nicht wieder freigegebenen Objekte anzeigen zu lassen?

Vielen Dank für Eure Antworten!

mkinzler 6. Sep 2008 18:13

Re: Unbenutzte Objekte erkennen
 
Merk dir die Objekte

Bernhard Geyer 6. Sep 2008 18:14

Re: Unbenutzte Objekte erkennen
 
Einfach FastMM einbinden, TD32-Debug-Infos aktivieren und am Programmende vom erzeugten Logfile auf den Erstellungspunkt der nicht mehr freigegeben Objekt hingewiesen werden.

DeddyH 6. Sep 2008 18:18

Re: Unbenutzte Objekte erkennen
 
Letzteres kann ich auch nur empfehlen, besser Infos wirst Du IMHO kaum bekommen.

Reinhard Kern 6. Sep 2008 18:23

Re: Unbenutzte Objekte erkennen
 
Zitat:

Zitat von bernie110
Gibt es eine Möglichkeit, sich entweder in der Borland-IDE oder per Programmcode solche eigenen erzeugten und nicht wieder freigegebenen Objekte anzeigen zu lassen?

Vielen Dank für Eure Antworten!

Hallo,

du kannst ja eine Prozedur DeleteAllObjects schreiben, in die du alle aufnimmst, und die du am Ende aufrufst. Ich benutze oft Objekte, die nur bei Bedarf erzeugt werden (z.B. Datenverbindungen oder V24-Schnittstellen), im finalen Zertrümmerer kann man ja abfragen "if O1 <> nil then O1.Delete" oder sichere Verfahren wie FreeAndNil verwenden.

Natürlich darf man da auch nicht vergessen, ein neu programmiertes Objekt einzufügen!

Gruss Reinhard

Jelly 6. Sep 2008 20:18

Re: Unbenutzte Objekte erkennen
 
Zitat:

Zitat von Reinhard Kern
du kannst ja eine Prozedur DeleteAllObjects schreiben,

Zitat:

Zitat von Reinhard Kern
Natürlich darf man da auch nicht vergessen, ein neu programmiertes Objekt einzufügen!

Oder besser gleich alle Objekte in eine TObjectList aufnehmen, und diese Liste einfach am Ende freigeben. Die ObjectList hat die Funktionalität, beim Freigeben alle enthaltenen Objekte mit freizugeben.

Elvis 6. Sep 2008 20:50

Re: Unbenutzte Objekte erkennen
 
Es gäbe auch die Möglichkeit "Free" zu vergessen.
Barry Kelly schreib vor einiger Zeit einen MM, der den Boehm Garbage Collector für C/C++ in Delphi nutzbar macht.
Ich hatte ein Windowsservice System, dass damit lange Zeit absolut sorgenfrei lief, und es enthielt fast kein Free. *g*
Und es läuft nur deshalb nicht mehr, weil ich es irgendwann durch eine .Net-basierte Lösung ersetzt habe.

bernie110 12. Sep 2008 06:44

Re: Unbenutzte Objekte erkennen
 
Zitat:

Zitat von Jelly
Zitat:

Zitat von Reinhard Kern
du kannst ja eine Prozedur DeleteAllObjects schreiben,

Zitat:

Zitat von Reinhard Kern
Natürlich darf man da auch nicht vergessen, ein neu programmiertes Objekt einzufügen!

Oder besser gleich alle Objekte in eine TObjectList aufnehmen, und diese Liste einfach am Ende freigeben. Die ObjectList hat die Funktionalität, beim Freigeben alle enthaltenen Objekte mit freizugeben.

Die TObjectList nutze ich sehr intensiv an vielen Stellen im Programm :) Und diese Listen sind auch noch geschachtelt...
Da nun am Schleifenende nicht alle Listen lösche kann, sondern teilweise nur die Objekte darin und da ich offensichtlich nicht alle Objekte lösche, brauche ich eben so ein Tool.
Ich werde am Wochenende mal Euren Vorschlag mit FastMM ausprobieren.

Danke nochmals!

RWarnecke 12. Sep 2008 07:22

Re: Unbenutzte Objekte erkennen
 
Ein anderes Tool wäre noch Eurekalog.

bernie110 12. Okt 2008 19:49

Re: Unbenutzte Objekte erkennen
 
Zitat:

Zitat von bernie110
[...] Ich werde am Wochenende mal Euren Vorschlag mit FastMM ausprobieren.

Na ja, ich habe es erst jetzt geschafft, FastMM4 auzuprobieren und einzusetzen. Nach anfänglichen Schwierigkeiten, das Output-Textfile zu erzeugen (die dll-Datei muss im Application-Ordner vorhanden sein!), bin ich jetzt dabei, herauszufinden, wo die vielen Objekte, die noch belegt sind, erzeugt werden und wie ich sie passend dazu wieder löschen kann.

Danke für Eure Tipps!

bernau 13. Okt 2008 10:09

Re: Unbenutzte Objekte erkennen
 
Zitat:

Zitat von Jelly
Oder besser gleich alle Objekte in eine TObjectList aufnehmen, und diese Liste einfach am Ende freigeben. Die ObjectList hat die Funktionalität, beim Freigeben alle enthaltenen Objekte mit freizugeben.


Hhmmm? Wie der OP vorher geschrieben hat, werden die Objekte teilweise freigegeben und teilweise nicht. Eine Objektliste merkt aber nicht, daß ein Objekt freigegeben wurde. Der Zeiger ist immer noch vorhanden. Wenn nun die Objektliste versucht ein Objekt freizugeben, welches gar nicht mehr vorhanden ist, dann dürfte es krachen.

Relicted 13. Okt 2008 10:23

Re: Unbenutzte Objekte erkennen
 
Ich werfe einfach mal ein Wort in den Raum was dir alle Sorgen abnimmt... Keine Referenz kein Objekt:
"Interfaces"

Gruß
reli

bernie110 15. Okt 2008 19:03

Re: Unbenutzte Objekte erkennen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Jelly
Oder besser gleich alle Objekte in eine TObjectList aufnehmen, und diese Liste einfach am Ende freigeben. Die ObjectList hat die Funktionalität, beim Freigeben alle enthaltenen Objekte mit freizugeben.

Letztlich hat nur _dieser_ Hinweis die Lösung gebracht, nachdem meine anderen Ideen immer wieder zu Fehlern führten.

Also habe ich eine zusätzliche Liste erzeugt, die nur dazu da ist, die Objekte zu listen und am Ende wieder freizugeben.

Nun habe ich laut FastMM nur noch 2 Leaks übrig, von denen ich aber nicht wieß, wie ich sie beseitigen kann; möglicherweise ist ja auch noch ein Bug in den Standard-Modulen?

Kurzfassung:
Zitat:

A memory block has been leaked. The size is: 68

Stack trace of when this block was allocated (return addresses):
402A97 [System][@GetMem]
404043 [System][TObject.NewInstance]
40440A [System][@ClassCreate]
404078 [System][TObject.Create]
762197C5 [Unknown function at SHFree]
4D05F3 [ShellCtrls][TShellFolder.Create]
4D03F9 [ShellCtrls][CreateRootFromPIDL]
4D0549 [ShellCtrls][CreateRootFolder]
76F38A2F [GetClientRect]
4608B0 [Controls][TWinControl.GetClientRect]

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

...

A memory block has been leaked. The size is: 52

Stack trace of when this block was allocated (return addresses):
402A97 [System][@GetMem]
404043 [System][TObject.NewInstance]
40440A [System][@ClassCreate]
4D05B3 [ShellCtrls][TShellFolder.Create]
4D03F9 [ShellCtrls][CreateRootFromPIDL]
4D0549 [ShellCtrls][CreateRootFolder]
76F38A2F [GetClientRect]
4608B0 [Controls][TWinControl.GetClientRect]
4D1E9C [ShellCtrls][TCustomShellTreeView.CreateRoot]
4D2CB1 [ShellCtrls][TCustomShellTreeView.Loaded]

The block is currently used for an object of class: TShellFolder
Die komplette FastMM-Ausgabe ist im Anhang - hat jemand von Euch eine Idee oder gar die Lösung?

Danke für Eure Beiträge! :thumb:

hitzi 6. Nov 2008 13:29

Re: Unbenutzte Objekte erkennen
 
Hab grad das selbe Problem bei mir festgestellt - hier steht die Lösung: http://www.bpsoftware.com/blog/labels/Fixes.html


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