如何在C ++程序中观看gdb中的vtable?

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

bbt*_*trb 5

您可以使用-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)

这应该让您了解在调试等过程中预期的地址范围。