2017-02-18 6 views
0

So wollte ich alle Netzwerk-Dump ich als lesbare Daten protokollieren. Ich habe den protokollierten Speicherauszug erfolgreich in ihre jeweiligen Strukturen gemappt (mit memcpy) und wünsche nun, dass die gleichen Klassenwerte gedruckt werden (ohne eine print() Funktion per se zu definieren).Gibt es eine Möglichkeit, alle Klassendaten zu drucken

Mit dem Qt-Debugger (der gdb verwendet, wenn ich mich richtig erinnere), kann ich Haltepunkte verwenden, um die Werte in einer Datei zu sehen und sogar zu kopieren. In Anbetracht der Tatsache, dass die Anwendung einige Zeit dauern kann, um den Dump in lesbare Daten zu verarbeiten und zu konvertieren, ist es mir möglich, das System zum Kopieren der Debug-Informationen in eine Datei zu automatisieren?

Ich habe die Dokumentation gdb durchlaufen und konnte keine Funktion für das gleiche finden. Die meisten Online-Lösungen beinhalten das Erstellen einer print() -Funktion für jede Klasse.

Die Frage unterscheidet sich von How to get all properties/variables of a class at runtime/dynamically in C++: Die Frage fragt, wie Sie den Datentyp @ Runtime erhalten können. Ich definiere andererseits den Datentyp während der Kompilierung (in einer * .h-Header-Datei, die alle Strukturinformationen enthält und sogar alle Werte auf die Variable abbildet). Das Problem dreht sich hauptsächlich um die Tatsache, dass die Daten zum Drucken über einen Debugger angesehen werden können; Ich möchte die Anzeige und das Kopieren derselben auf eine Datei/Konsole automatisieren.

+0

Mögliches Duplikat von [Wie alle Eigenschaften/Variablen einer Klasse zur Laufzeit/dynamisch in C++ abgerufen werden] (http://stackoverflow.com/questions/4017708/how-to-get-all-properties-variables-of -a-class-at-runtime-dynamisch-in-c) – jpo38

+0

Siehe den verknüpften Beitrag oben. Da es keine Möglichkeit gibt, eine Liste von Attributen aus einer Klasse zu erhalten, gibt es keine Möglichkeit, sie zu drucken! – jpo38

+0

Sie suchen nach einer Serialisierung. Sehen Sie sich http://www.boost.org/doc/libs/1_63_0/libs/serialization/doc/ an. Seien Sie gewarnt, dass dies überhaupt nicht mit C# oder Java vergleichbar ist, die in die Sprache integriert sind. –

Antwort

-1

Das Ausgeben des rohen Objekts ist so einfach wie das Abrufen eines char-Zeigers auf dem Objekt und das Drucken der Daten so lange wie die Größe des Objekts. Es wird offensichtlich nicht möglich sein, auf Daten zuzugreifen, die in Zeigern gespeichert sind, nur ihre Adresse.

Da Sie bereit sind, memcpy Ausgabe als das Format zu nehmen, hier ist ein Code für das gleiche:

struct large_object fi; 
... 
char* pt = (char*)&fi; 

for (size_t i = 0; i < sizeof(fi); ++i) 
{ 
    printf("%1x", *(pt + i)); 
} 
printf("\n"); 

Bei Bedarf können Sie die Bit-für-Bit-Ausgabe auch erhalten, auf dem Hinzufügen eines weiteren Schleife:

for (int bit_to_print = sizeof(char)-1; bit_to_print < 0; --bit_to_print) 
    { 
     printf("%d", *(pt + i) & (1 << bit_to_print); 
    } 

PS: Die innere Schleife wäre nicht die gleiche auf einem kleinen Endian und Big-Endian-Systemen.

+0

Warum der Downvote? –

Verwandte Themen