4

在调试有故障转储的地方时,vtable 指针是内存中对象的良好指标。

我想在 gdb 中做的是能够通过执行类似的操作来查询 vtable

info address 'vtable for Bar'

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

例子:

info address _ZTV3Bar

尝试找出 vtable 重命名的名称并不是世界末日,但它很烦人(即使用 objdump -t myexecutable)。

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

4

3 回答 3

5

改用 info 变量:

Bar 的信息变量 vtable

于 2014-05-01T17:16:20.797 回答
2

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

句法

info vtbl [Expression]

参数

Expression 指定一个表达式,该表达式将被评估以获取指向应该显示虚拟方法表的对象的指针。

于 2016-12-29T20:42:50.437 回答
0

那是违反规则的。

这些是哪些规则?

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

但你做了:

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

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

于 2013-08-21T18:07:21.533 回答