Rap*_* R. 5 c++ gcc gdb virtual-functions
我的一个C ++程序中有一个有趣的问题。显然,我的其中一个类的vtable在程序执行期间被弄乱了。在gdb会话中,我发现如果直接调用对象的方法会成功,但是如果我使用指针或引用,最终会遇到完全不相关的类的析构函数,该类不会在任何时候实例化。this当然,无需更改-Pointer。
假设我的观察是正确的,如何在gdb中观察对象的vtable?我在Linux上使用gcc,我的gdb版本是GNU gdb (Ubuntu/Linaro 7.3-0ubuntu2) 7.3-2011.08。
您可以使用-fdump-class-hierarchygcc 选项来提供 vtable 信息,但是输出可能非常冗长且难以阅读。
例如,给出以下简单的类:
class Base {
public:
virtual int method() = 0;
};
class Derived : public Base {
public:
int method() {
return 10;
}
};
Run Code Online (Sandbox Code Playgroud)
相关输出是
Vtable for Base
Base::_ZTV4Base: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI4Base)
16 (int (*)(...))__cxa_pure_virtual
Class Base
size=8 align=8
base size=8 base align=8
Base (0x7f14c308ccc0) 0 nearly-empty
vptr=((& Base::_ZTV4Base) + 16u)
Vtable for Derived
Derived::_ZTV7Derived: 3u entries
0 (int (*)(...))0
8 (int (*)(...))(& _ZTI7Derived)
16 (int (*)(...))Derived::method
Class Derived
size=8 align=8
base size=8 base align=8
Derived (0x7f14c2ee7208) 0 nearly-empty
vptr=((& Derived::_ZTV7Derived) + 16u)
Base (0x7f14c308cd20) 0 nearly-empty
primary-for Derived (0x7f14c2ee7208)
Run Code Online (Sandbox Code Playgroud)
这应该让您了解在调试等过程中预期的地址范围。
| 归档时间: |
|
| 查看次数: |
5080 次 |
| 最近记录: |