2010-01-23 12 views
13

¿Hay un indicador en g++ o herramientas para volcar las variables de miembro de una estructura/clase? Como ejemplo, consideremos el código fuente como estaVariables de miembros de clase/estructura de volcado en 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; }; 

quiero conseguir algo similar 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 no funciona. Sólo imprime las funciones miembro.)

(Suponga que no sé las clases A a D, o hay tantas clases que no quiero enumerarlas yo mismo.)

(Específicamente, deseo volcar las variables miembro de http://www.opensource.apple.com/source/xnu/xnu-1456.1.26/iokit/IOKit/IOUserClient.h).

Respuesta

6

Utilice la herramienta adecuada para el trabajo correcto. g ++ no es una herramienta de visualización de jerarquía.

Siempre puede utilizar una herramienta externa como doxygen, que puede volcar graphviz diagramas.

Para las soluciones de energía existe gcc-xml, que puede volcar todo su programa en un archivo xml que puede analizar a voluntad.

+1

Gracias! 'gcc-xml' funciona para mí, aunque todavía tengo que escribir un script no muy pequeño para convertirlo de nuevo al formulario que necesito. (http://networkpx.googlecode.com/svn/etc/print-struct-members.py en caso de que alguien esté interesado). – kennytm

2

Yo usaría ddd, luego mostraría las estructuras en el panel de datos. Puede expandir una estructura individual que apunta a otra estructura y la interfaz de usuario seguirá de uno a otro. Una herramienta de depuración muy poderosa.

+0

Gracias. Pero eso me obliga a enumerar todas las estructuras. Además, algunas estructuras son desafortunadamente abstractas, así que no puedo 'nuevas'. – kennytm

+0

+1. Algunas veces el código es demasiado complejo/ofuscado para [Doxygen] (https://en.wikipedia.org/wiki/Doxygen) para darle sentido, pero el depurador aún funcionará. Tuve más suerte accediendo a estructuras complejas con [Nemiver] (https://en.wikipedia.org/wiki/Nemiver) que con [kdbg] (https://en.wikipedia.org/wiki/KDbg). [DDD] (https://en.wikipedia.org/wiki/Data_Display_Debugger) también es una opción intrigante, pero a la UI le lleva algo de tiempo acostumbrarse. – nobar

Cuestiones relacionadas