2011-05-31 123 views
20

我想用gdb打印一個對象的vtable;我發現使用GDB打印C++ vtables

show print vt bl on 

設置,但我仍然不知道如何打印vtable - p *對象仍然不打印出來。

如何打印vtable?

+0

你爲什麼要做這樣的事情?請注意,我不是告訴你不要這樣做。我很好奇需要做什麼。 – 2011-05-31 18:13:47

+0

看着程序集,對相同函數的wo虛擬函數調用會經歷與vtable不同的偏移,導致段錯誤。我試圖調試這個問題。 – 2011-05-31 18:41:30

+0

你可以發佈一些環境代碼嗎?也許這是一個我們無需通過程序集就能發現的錯誤。 – 2011-07-29 17:11:55

回答

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

其中「obj」是要打印的vtable的對象,而10是方法的數量。

37

一個更緊湊的解決方案:

​​
+0

這是一個更好的解決方案! – 2013-08-08 21:41:32

+2

甚至更​​緊湊:'x/10a *(void **)obj',儘管它也會打印方法指針的地址(即'&ptr')。 – Ruslan 2016-01-01 16:55:52

22

如果你有GDB的足夠新的版本,您可能想看看命令「VTBL信息」。

google搜索的回答這個問題時,我只注意到的功能,我注意到了帖子的gdb的郵件列表大約2012年,尤其是這一次,從2012年3月:

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

+0

這是最好的解決方案! – schieferstapel 2014-05-15 09:51:26

+0

如果你想知道,這不能用於lldb。 – whoKnows 2015-05-23 17:06:39

2

在實際GDB 7.5 .1命令是而不是 info vtable!

使用 信息VTBL

2

對於例如在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