C ++: Wie werden alle instanziierten Objekte zur Laufzeit gezählt?

8

Ich habe ein großes Framework, das aus vielen C ++ Klassen besteht. Gibt es einen Weg, irgendwelche Werkzeuge zur Laufzeit zu verwenden, um alle C ++ - Objekte zu verfolgen, die gerade konstruiert werden und gegenwärtig existieren?

Beispielsweise hat die Anwendung zu einem bestimmten Zeitpunkt t1 möglicherweise die Objekte A1, A2 und B3, aber zum Zeitpunkt t2 hat sie A1, A4, C2 usw.?

Dies ist ein plattformübergreifendes Framework, aber ich bin vertraut mit Linux, Solaris und (möglicherweise) Mac OS X.

    
nina 28.04.2010, 12:37
quelle

5 Antworten

10

Sie können Code in den Destruktor und den Konstruktor der Objekte einfügen, die Sie zählen möchten:

%Vor%

Vergessen Sie nicht, den Zähler in all -Konstruktoren zu erhöhen (Kopierkonstruktoren, etc.)

BEARBEITEN: In dieser Situation kann man das seltsam wiederkehrende Vorlagenmuster verwenden:

%Vor%

und dann:

%Vor%

um automatisch einen Zähler für jede Klassenart zu generieren.

    
Andreas Brinck 28.04.2010, 12:46
quelle
1

Ich nehme an, dass Sie nur Objekte auf dem Heap zählen. Wenn dies der Fall ist, können Sie alle Aufrufe auf neu speichern und löschen, indem Sie sie durch einige benutzerdefinierte Makros ersetzen.

Wir haben eine solche benutzerdefinierte Protokollierungsfunktion entwickelt. Der Hauptzweck war, Speicherlecks zu verfolgen, aber es kann auch verwendet werden, um herauszufinden, wie viele Objekte zu einem bestimmten Zeitpunkt vorhanden sind. Zum Beispiel

%Vor%

MY_LOGGING fügt den Zeitstempel automatisch am Anfang jeder Zeile hinzu. Die Zeile enthält den Klassennamen, den Dateinamen, die Zeilennummer, den Funktionsnamen und die Größe.

Ein Dienstprogramm analysiert die Logging-Datei und erstellt Grafiken, die die Anzahl der Objekte, die verwendete Gesamtgröße usw. jederzeit anzeigen.

Natürlich müssen Sie alle neuen / löschenden Aufrufe durch die Makros ersetzen. Das könnte ziemlich viel Arbeit sein.

    
cuteCAT 28.04.2010 14:01
quelle
0

Ich habe es selbst nicht benutzt, weil Massif das Werkzeug ist, nach dem Sie suchen. Ссылка

    
madmik3 28.04.2010 12:50
quelle
0

Machen Sie eine spezielle Basisklasse, die dem Java-Objekt entspricht, und lassen Sie jede Klasse davon ableiten. Setzen Sie dann in dieser Klasse die globalen Counter-Operationen, die Andreas Brinck im Konstruktor / Destruktor vorschlägt. Zusätzlich dazu, dass ein abgeleitetes Objekt nur als ein Objekt gezählt wird, müssen Sie nur 1 Konstruktor und 1 Destruktor instrumentieren. Natürlich ist der Nachteil, dass Sie die Definition jeder Klasse leicht ändern müssen ...

    
frankc 28.04.2010 13:05
quelle
0

Dies ist nur Solaris, aber wenn das eine Option ist, können Sie dtrace verwenden, um die Anzahl der Konstruktor- und Destruktoraufrufe für jede Ihrer Klassen zu verfolgen und sie in einem Intervall auszudrucken. Dies erfordert eine Menge Arbeit, um alle Eingangs- / Rückkehrblöcke einzurichten, aber ich vermute, dass das dtrace-Skript automatisch generiert werden kann.

    
Mark B 28.04.2010 13:16
quelle

Tags und Links