如何使用gdb按名称显示vtable

时间:2013-08-21 17:22:37

标签: c++ debugging gdb vtable

调试崩溃转储的位置时,vtable指针是内存中对象的良好指示器。

我想在gdb中做的是能够通过执行类似

的操作来查询vtable
info address 'vtable for Bar'

但是,我发现的唯一方法是执行此操作(不需要对象的有效实例)是使用损坏的名称作为vtable。

示例:

info address _ZTV3Bar

尝试找出vtable错位名称并不是世界末日,但这是一个烦恼(即使用objdump -t myexecutable)。

有没有人知道我可以用一种不那么痛苦的方式找到类型的vtable地址的方法(不需要类型的有效实例)?
   - 规则:不能要求有问题的对象的有效实例,并在对象中找到vtable指针。

3 个答案:

答案 0 :(得分:3)

改用信息变量:

  Bar的

info变量vtable

答案 1 :(得分:2)

显示有关对象的虚方法表(vtable)的信息

语法

info vtbl [Expression]

参数

表达 指定将被计算的表达式,以获取指向应显示虚拟方法表的对象的指针。

答案 2 :(得分:0)

  

这违反了规则。

这些规则是什么?

  

我没有该对象的实例,只是想找到该类型的vtable。

但你这样做:

set print object on
print *(Bar*) 0x123456

这将尝试在0x123456处打印对象,就像它是Bar一样,或者从Bar派生。如果实际上该位置的对象是从Bar派生的,GDB将推导出派生类型,并打印其成员。