Ответ 1
(gdb) set $i = 0 (gdb) while $i < 10 >print $i >p /a (*(void ***)obj)[$i] >set $i = $i + 1 >end
Где "obj" - это объект, vtable которого вы хотите распечатать, а 10 - количество методов.
Я пытаюсь напечатать объект vtable с помощью gdb; Я нашел
show print vt bl on
но я до сих пор не знаю, как печатать объект vtable-p *, все еще не распечатывает его.
Как распечатать vtable?
(gdb) set $i = 0 (gdb) while $i < 10 >print $i >p /a (*(void ***)obj)[$i] >set $i = $i + 1 >end
Где "obj" - это объект, vtable которого вы хотите распечатать, а 10 - количество методов.
Более компактное решение:
p /a (*(void ***)obj)[0]@10
Если у вас достаточно новая версия gdb, вы можете посмотреть команду "info vtbl".
Я только заметил эту функцию при поиске по запросу для ответа на этот вопрос, и я заметил сообщения в списке рассылки gdb около 2012 года, особенно с марта 2012 года:
В фактическом gdb 7.5.1 команда не является информацией vtable!
Использование info vtbl
Для примера в 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