Подтвердить что ты не робот

Печать С++ vtables с использованием GDB

Я пытаюсь напечатать объект vtable с помощью gdb; Я нашел

show print vt bl on

но я до сих пор не знаю, как печатать объект vtable-p *, все еще не распечатывает его.

Как распечатать vtable?

4b9b3361

Ответ 1

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

Где "obj" - это объект, vtable которого вы хотите распечатать, а 10 - количество методов.

Ответ 2

Более компактное решение:

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

Ответ 3

Если у вас достаточно новая версия gdb, вы можете посмотреть команду "info vtbl".

Я только заметил эту функцию при поиске по запросу для ответа на этот вопрос, и я заметил сообщения в списке рассылки gdb около 2012 года, особенно с марта 2012 года:

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

Ответ 4

В фактическом gdb 7.5.1 команда не является информацией vtable!

Использование info vtbl

Ответ 5

Для примера в http://en.cppreference.com/w/cpp/language/virtual

Без использования 'info 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