2010-01-23 12 views
13

C'è un flag in g++ o strumenti per scaricare le variabili membro di una struct/class? Per illustrare, si consideri il codice sorgente come questoVariabili della classe Dump/struct member 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; }; 

voglio ottenere qualcosa di simile a

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 

(-fdump-class-hierarchy non funziona. Esso stampa solo le funzioni membro.)

(Si supponga I non conosco le classi A a D, o ci sono così tante classi che non voglio elencarle da solo.)

(In particolare, voglio scaricare le variabili membro di http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/iokit/IOKit/IOUserClient.h).

risposta

6

Utilizzare lo strumento giusto per il lavoro giusto. g ++ non è molto uno strumento di visualizzazione gerarchico.

È sempre possibile utilizzare uno strumento esterno come doxygen, che può scaricare gli schemi graphviz.

Per le soluzioni di alimentazione è disponibile gcc-xml, che può scaricare l'intero programma in un file xml che è possibile analizzare a piacere.

+1

Grazie! 'gcc-xml' funziona per me, anche se ho ancora bisogno di scrivere uno script non troppo piccolo per riconvertirlo nel modulo che mi serve. (http://networkpx.googlecode.com/svn/etc/print-struct-members.py nel caso in cui qualcuno fosse interessato.) – kennytm

2

Vorrei utilizzare ddd, quindi visualizzare le strutture nel riquadro dei dati. È possibile espandere una singola struttura che punta a un'altra struttura e l'interfaccia utente seguirà da una all'altra. Uno strumento di debug molto potente.

+0

Grazie. Ma questo richiede di elencare tutte le strutture. Inoltre, alcune strutture sono sfortunatamente astratte quindi non posso "nuove" esse. – kennytm

+0

+1. A volte il codice è troppo complesso/offuscato per [Doxygen] (https://en.wikipedia.org/wiki/Doxygen) per dare un senso a ciò, ma il debugger continuerà a funzionare. Ho avuto più fortuna ad accedere a strutture complesse con [Nemiver] (https://en.wikipedia.org/wiki/Nemiver) rispetto a [kdbg] (https://en.wikipedia.org/wiki/KDbg). [DDD] (https://en.wikipedia.org/wiki/Data_Display_Debugger) è anche un'opzione intrigante, ma l'interfaccia utente si sta abituando. – nobar

Problemi correlati