2010-01-23 10 views
13

Gibt es ein Flag in g++ oder Tools, um die Mitgliedsvariablen einer Struktur/Klasse auszugeben? Zur Veranschaulichung Quellcode wie dieseDump-Klasse/Strukturelementvariablen in g ++

struct A { virtual void m() {}; }; 
struct B : public A { int b; virtual void n() = 0; }; 
struct C : public B { int c1, c2; void o(); }; 
struct D : public C { virtual void n() {}; A d; }; 

ich etwas will prüfen, ähnlich wie

A: 0 = (vptr) 

B: 0 = (vptr) 
    4 = b 

C: 0 = (vptr) 
    4 = b 
    8 = c1 
    12 = c2 

D: 0 = (vptr) 
    4 = b 
    8 = c1 
    12 = c2 
    16 = d 

bekommen (-fdump-class-hierarchy funktioniert nicht. Er druckt nur die Mitgliederfunktionen.)

(ich nehme an kenne die Klassen A bis nicht, oder es gibt so viele Klassen, dass ich sie selbst nicht auflisten will.)

(Insbesondere möchte ich die Mitgliedsvariablen von http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/iokit/IOKit/IOUserClient.h ausgeben).

Antwort

6

Verwenden Sie das richtige Werkzeug für den richtigen Job. g ++ ist nicht viel von einem Hierarchieanzeigewerkzeug.

Sie können immer ein externes Tool wie doxygen verwenden, das graphviz Diagramme dumpen kann.

Für Power-Lösungen gibt es gcc-xml, die Ihr gesamtes Programm in eine XML-Datei ablegen können, die Sie beliebig analysieren können.

+1

Danke! 'gcc-xml' funktioniert für mich, obwohl ich immer noch ein nicht ganz so kleines Skript schreiben muss, um es wieder in die Form zu konvertieren, die ich brauche. (http://networkpx.googlecode.com/svn/etc/print-struct-members.py falls jemand interessiert ist.) – kennytm

2

Ich würde DDD verwenden, dann die Strukturen im Datenbereich anzeigen. Sie können eine einzelne Struktur erweitern, die auf eine andere Struktur verweist, und die Benutzeroberfläche wird von einer zur anderen folgen. Ein sehr leistungsfähiges Debugging-Tool.

+0

Danke. Aber dazu muss ich alle Strukturen auflisten. Außerdem sind einige Strukturen leider abstrakt, so dass ich sie nicht "neu" machen kann. – kennytm

+0

+1. Manchmal ist der Code für [Doxygen] (https://en.wikipedia.org/wiki/Doxygen) zu komplex/verschleiert, um einen Sinn zu ergeben, aber der Debugger wird hoffentlich immer noch funktionieren. Ich hatte mehr Glück beim Zugriff auf komplexe Strukturen mit [Nemiver] (https://en.wikipedia.org/wiki/Nemiver) als mit [kdbg] (https://en.wikipedia.org/wiki/KDbg). [DDD] (https://en.wikipedia.org/wiki/Data_Display_Debugger) ist auch eine faszinierende Option, aber die Benutzeroberfläche ist etwas gewöhnungsbedürftig. – nobar