Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 打印C++;使用GDB的vtables_C++_Gdb - Fatal编程技术网

C++ 打印C++;使用GDB的vtables

C++ 打印C++;使用GDB的vtables,c++,gdb,C++,Gdb,我正在尝试使用gdb打印对象的vtable;我找到了 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 (gdb)设置$i=0 (gdb)而$i打印$i >应付款(*(作废***)

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

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 (gdb)设置$i=0 (gdb)而$i<10 >打印$i >应付款(*(作废***)obj)[$i] >设置$i=$i+1 >结束
其中“obj”是要打印其vtable的对象,10是方法数。

更紧凑的解决方案:

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

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

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


在实际的gdb 7.5.1中,命令是不可更改的

使用 info vtbl

中的示例

不使用“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
(gdb)p b
$1={u vptr.Base=0x400a60}
(gdb)x/16x 0x400a60
0x400a60:0x0040094c 0x00000000 0x72654437 0x64657669
(gdb)x/16x 0x0040094c
0x40094c:0xE5894850x10EC8348 0xf87d8948 0x400a15be
0x40095c:0x10c0bf00 0xf9e80060 0xc9fffffd 0x485590c3
0x40096c:0x8348e589 0x894810ec 0x1bbef87d 0xbf00400a
0x40097c:0x006010c0 0xfffddbe8 0x66c3c9ff 0x00841f0f

你为什么要做这样的事?注意,我不是告诉你不要这样做。我很好奇需要做什么。查看程序集,对同一个函数的两个虚拟函数调用正在通过vtable的不同偏移量,从而导致segfault。我正在调试这个问题。你能发布一些环境代码吗?也许这是一个我们不需要经过汇编就可以发现的错误。或者更紧凑的:
x/10a*(void**)obj
,尽管它也会打印方法指针的地址(即
&ptr
)。