我想用gdb打印一个对象的vtable;我发现使用GDB打印C++ vtables
show print vt bl on
设置,但我仍然不知道如何打印vtable - p *对象仍然不打印出来。
如何打印vtable?
我想用gdb打印一个对象的vtable;我发现使用GDB打印C++ vtables
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是方法的数量。
一个更紧凑的解决方案:
这是一个更好的解决方案! – 2013-08-08 21:41:32
甚至更紧凑:'x/10a *(void **)obj',尽管它也会打印方法指针的地址(即'&ptr')。 – Ruslan 2016-01-01 16:55:52
如果你有GDB的足够新的版本,您可能想看看命令“VTBL信息”。
google搜索的回答这个问题时,我只注意到的功能,我注意到了帖子的gdb的邮件列表大约2012年,尤其是这一次,从2012年3月:
这是最好的解决方案! – schieferstapel 2014-05-15 09:51:26
如果你想知道,这不能用于lldb。 – whoKnows 2015-05-23 17:06:39
在实际GDB 7.5 .1命令是而不是 info 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
你为什么要做这样的事情?请注意,我不是告诉你不要这样做。我很好奇需要做什么。 – 2011-05-31 18:13:47
看着程序集,对相同函数的wo虚拟函数调用会经历与vtable不同的偏移,导致段错误。我试图调试这个问题。 – 2011-05-31 18:41:30
你可以发布一些环境代码吗?也许这是一个我们无需通过程序集就能发现的错误。 – 2011-07-29 17:11:55