2009-06-21 22 views
1

Wie kann ich alle instanziierten Objekte in allen Anwendungen mit FASTMM4 oder dem Standard-Speichermanager auflisten?Wie listet alle instanziierten Objekte auf?

+0

Warum möchten Sie diese Informationen? Suchst du nach Speicherlecks? Ich denke, dass es dann einen anderen Weg geben kann. – Alex

+0

@Alexander: Nein, Mann! FASTMM4 zeigt Speicherlecks leicht, in Wahrheit wollte ich wissen, ob eine bestimmte Klasse bei VCL geladen wurde und wer es instanziiert hat, aber jetzt überlasse ich einfach diese Frage. Vielen Dank! –

Antwort

3

Sie könnten wahrscheinlich tun dies mit FastMM4, aber es wäre ein komplizierter sein. Versuchen Sie, den Code für die Prozedur ScanForMemoryLeaks zu untersuchen, um zu sehen, wie es gemacht wird.

Diese Routine überprüft alle zugewiesenen Heap-Speicher gegen die Liste der erwarteten Speicherlecks und meldet alles, was oben zeigt, eine Zählung und die Objektklassennamen einschließlich, wenn es Objekte findet. Was Sie tun möchten, ist, den gesamten zugewiesenen Heap-Speicher zu überprüfen und den Zähl- und Objektklassennamen aller gefundenen Objekte zu melden, also ist es eine wirklich ähnliche Aufgabe. Lassen Sie die registrierte Zeigerliste einfach aus und überprüfen Sie alles, was kein Objekt ist.

1

Auch seine nicht unterstützt und nicht gefördert, sondern je nach Situation könnten Sie in der Lage sein TObject zu bearbeiten Schöpfung und Zerstörung aufnehmen - da alle Objekte sind TObject dies den Trick tun könnte. Allerdings ist das Modifizieren der VCL wirklich verpönt, also frage ich mich, ob Sie ein Helper-Objekt (das seit 2006 verfügbar ist, denke ich) das gleiche tun können. Schreiben Sie in eine andere Liste usw. mit Details zu jedem erstellten Objekt.

+0

Nein, Sie können dafür kein Hilfsobjekt verwenden. – gabr

+0

Gut! Sollte funktionieren, aber ich denke VCL-Standardeinstellungen ändern ist die letzte Option, aber wenn es keine andere Lösung gibt, werde ich das tun. Vielen Dank. –

+0

@gabr: Wenn die Liste eine globale ist, kann er .. Was er nicht mit einem Helfer kann ist Instanzdaten zu erstellen ... –

0

Eine interessante Art und Weise Tony Allen Vorschlag zu implementieren könnte sein, die Objekterstellung und Zerstörung Methoden zur Laufzeit haken. Es gibt eine interessante Bibliothek auf Google Code, die Teil des AsmProfiler-Projekts ist (ein sehr schönes Stück IMHO), das den Trick machen könnte. Hier ist der Link zu der KOLDetours Einheit, die alle schweres Heben tut.

FWIW implementiert I einen Rahmen zurück in den Delphi 4/5 Tage, die einen instrumentierten Basisklasse enthalten, die gegebenenfalls Objekterstellung/Zerstörung verfolgt. Dies funktionierte gut zum Aufspüren von Objektlecks und dergleichen, erzeugte jedoch eine enorme Menge an Informationen. FASTMM4 ist eine viel bessere Option, wenn Sie nur wissen müssen, welche Objekte beim Herunterfahren geleakt haben.

0

Sie können den Speichermanager ändern, indem Sie SetMemoryManager aufrufen. Sie können Ihr eigenes MM schreiben, das ein einfacher Stub sein wird: es wird alle Anrufe zu altem MM umleiten (was FastMM ist, Sie können es erhalten, indem Sie GetMemoryManager aufrufen) und alle Speicheroperationen irgendwo protokollieren. Sie können die Objekterzeugung/-zerstörung erkennen, indem Sie sich die Aufrufliste ansehen: Der Aufruf sollte von der NewInstance-Methode von TObject erfolgen.

Verwandte Themen