2011-05-31 20 views
20

Estoy tratando de imprimir la tabla de contenido de un objeto usando gdb; He encontrado el ajusteImprimir tablas C++ usando GDB

show print vt bl on 

, pero todavía no sé realmente cómo imprimir la viable - p * objeto sigue sin imprimir hacia fuera.

¿Cómo imprimo vtable?

+0

¿Por qué quiere hacer una cosa así? Aviso, no te estoy diciendo que no lo hagas. Tengo curiosidad por saber qué necesidad hay de hacerlo. –

+0

Al observar el conjunto, las llamadas de funciones virtuales a la misma función pasan por diferentes desplazamientos al vtable, lo que provoca una segfault. Estoy tratando de solucionar este problema. –

+0

¿Se puede publicar un código de ambiente? Quizás es un error que podemos detectar sin pasar por el ensamblado. –

Respuesta

10
 
    (gdb) set $i = 0 
    (gdb) while $i < 10 
    >print $i 
    >p /a (*(void ***)obj)[$i] 
    >set $i = $i + 1 
    >end 

Donde "obj" es el objeto cuya vtable desea imprimir, y 10 es el número de métodos.

37

Una solución más compacta:

p /a (*(void ***)obj)[0]@10 
+0

¡Esta es una mejor solución! –

+2

O incluso más compacto: 'x/10a * (void **) obj', aunque también imprimirá las direcciones de los punteros del método (es decir' & ptr'). – Ruslan

22

Si usted tiene una lo suficientemente nueva versión de GDB, es posible que desee ver en la "información VTBL" comando.

sólo me di cuenta de la función cuando google para una respuesta a esta pregunta y me di cuenta de mensajes a la lista de correo GDB alrededor del año 2012, sobre todo éste de marzo de 2012:

http://permalink.gmane.org/gmane.comp.gdb.patches/73957

+0

¡Esta es la mejor solución! – schieferstapel

+0

En caso de que se lo pregunte, esto no se puede usar con lldb. – whoKnows

2

En el BGF 7,5 real .1 el comando es no info vtable!

Uso información VTBL

2

Para el ejemplo en http://en.cppreference.com/w/cpp/language/virtual

Sin utilizar 'información VTBL'

(gdb) p b 
$1 = {_vptr.Base = 0x400a60 <vtable for Base+16>} 

(gdb) x/16x 0x400a60 
0x400a60 <_ZTV4Base+16>: 0x0040094c 0x00000000 0x72654437 0x64657669 

(gdb) x/16x 0x0040094c 
0x40094c <Base::f()>: 0xe5894855 0x10ec8348 0xf87d8948 0x400a15be 
0x40095c <Base::f()+16>: 0x10c0bf00 0xf9e80060 0xc9fffffd 0x485590c3 
0x40096c <Derived::f()+2>: 0x8348e589 0x894810ec 0x1bbef87d 0xbf00400a 
0x40097c <Derived::f()+18>: 0x006010c0 0xfffddbe8 0x66c3c9ff 0x00841f0f 
Cuestiones relacionadas