使用GDB打印C++vtables

Print C++ vtables using GDB

本文关键字:C++vtables 打印 GDB 使用      更新时间:2023-10-16

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

show print vt bl on

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

如何打印vtable?

更紧凑的解决方案:

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

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

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

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

(gdb)设置$i=0(gdb)而$i<10>打印$i>p/a(*(void***)obj)[$i]>设置$i=$i+1>完

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

在实际的gdb 7.5.1中,命令是而不是信息vtable!

使用信息vtbl

例如http://en.cppreference.com/w/cpp/language/virtual

不使用"信息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