2011-10-12 10 views
5

Tengo una compilación de depuración de un programa (la máquina virtual de JavaScript V8) y quiero entender cómo se presentan instancias de ciertas clases en la memoria. Puedo estructuras bastante-impresión como esta:¿Cómo puedo ver cómo se distribuye una clase de C++ en la memoria con gdb?

(gdb) print thread_local 
$6 = { 
    blocks_ = { 
    data_ = 0x868ceb0, 
    capacity_ = 7, 
    length_ = 1 
    }, 
    entered_contexts_ = { 
    data_ = 0x868d828, 
    capacity_ = 1, 
    length_ = 1 
    }, 
    saved_contexts_ = { 
    data_ = 0x868d838, 
    capacity_ = 1, 
    length_ = 1 
    }, 
    spare_ = 0x0, 
    ignore_out_of_memory_ = false, 
    call_depth_ = 1, 
    handle_scope_data_ = { 
    next = 0x0, 
    limit = 0x0, 
    level = 0 
    } 
} 

pero yo quiero saber dónde esos diversos miembros (bloques, entered_contexts, etc.) son físicamente, con respecto al inicio del objeto. En sistemas basados ​​en Solaris, MDB puede hacer esto por C estructuras de este modo:

> ::print -at port_event_t 
0 port_event_t { 
    0 int portev_events 
    4 ushort_t portev_source 
    6 ushort_t portev_pad 
    8 uintptr_t portev_object 
    10 void *portev_user 
} 

En este ejemplo, cada campo se prefija con su desplazamiento desde el inicio de la estructura. Quiero hacer lo mismo para las clases de C++. gdb tiene que tener esta información para imprimir los miembros de la estructura, pero ¿hay alguna forma de verla?

Alternativamente, ¿hay alguna otra manera de hacer esto para un programa en ejecución?

Respuesta

4

Siempre puede imprimir la dirección de cada miembro y this para resolverlo usted mismo (utilice & para obtener la dirección de miembro, al igual que en el idioma).

0

La única forma que conozco es x /<number of bytes>x <variable name>

esto le dará un volcado hexadecimal entonces le corresponde a usted para leer la estructura.

2

Ojalá lo supiera.

Puede usar ptype para listar miembros. A continuación, puede fabricar offsetof de un hombre pobre como esto:

(gdb) p/a &((my_struct_*)0)->my_member 

(gdb) p/a &((struct sk_buff*)0)->iif 
$7 = 0x74 
0

Uso pahole (no forma parte de GDB).

Otra posibilidad es pahole.py (aún no confirmada).

+0

Gracias. Esto se ve muy interesante. –

Cuestiones relacionadas