如何使用gdb按名称显示vtable

How to display a vtable by name using gdb

本文关键字:显示 vtable 何使用 gdb      更新时间:2023-10-16

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

我想在gdb中做的是能够通过做之类的事情来查询vtable

info address 'vtable for Bar'

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

示例:

info address _ZTV3Bar

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

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

使用信息变量:

条形的信息变量vtable

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

语法

info vtbl [Expression]

参数

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

这是违反规则的。

这些是什么规则?

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

但你做到了:

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

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