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.
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.
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.
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 ...
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.