调试崩溃转储的位置时,vtable指针是内存中对象的良好指示器。
我想在gdb中做的是能够通过执行类似
的操作来查询vtableinfo address 'vtable for Bar'
但是,我发现的唯一方法是执行此操作(不需要对象的有效实例)是使用损坏的名称作为vtable。
示例:
info address _ZTV3Bar
尝试找出vtable错位名称并不是世界末日,但这是一个烦恼(即使用objdump -t myexecutable)。
有没有人知道我可以用一种不那么痛苦的方式找到类型的vtable地址的方法(不需要类型的有效实例)?
- 规则:不能要求有问题的对象的有效实例,并在对象中找到vtable指针。
答案 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将推导出派生类型,并打印其成员。