使用GDB打印C ++ vtable

时间:2011-05-31 18:11:37

标签: c++ gdb

我正在尝试使用gdb打印对象的vtable;我找到了

show print vt bl on

设置,但我实际上还不知道如何打印vtable - p *对象仍然无法打印出来。

如何打印vtable?

5 个答案:

答案 0 :(得分:43)

更紧凑的解决方案:

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

答案 1 :(得分:33)

如果您有足够新版本的gdb,您可能需要查看“info vtbl”命令。

我在谷歌搜索这个问题的答案时才注意到该功能,我注意到大约2012年的gdb邮件列表的帖子,特别是2012年3月的这个帖子:

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

答案 2 :(得分:10)

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

其中“obj”是您要打印的vtable的对象,10是方法的数量。

答案 3 :(得分:3)

在实际的gdb 7.5.1中,命令是 not info vtable!

使用 info vtbl

答案 4 :(得分:3)

有关http://en.cppreference.com/w/cpp/language/virtual

的示例

不使用&#39; info vtbl&#39;

(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