如何使用 gdb 按名称显示 vtable

Gab*_*abe 3 c++ debugging gdb vtable

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

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

info address 'vtable for Bar'
Run Code Online (Sandbox Code Playgroud)

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

例子:

info address _ZTV3Bar
Run Code Online (Sandbox Code Playgroud)

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

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

小智 5

改用 info 变量:

Bar 的信息变量 vtable


Emp*_*ian 0

这是违反规则的。

这些是哪些规则?

我没有该对象的实例,但只想找到该类型的虚函数表。

但你做了:

set print object on
print *(Bar*) 0x123456
Run Code Online (Sandbox Code Playgroud)

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