GDB來理解C++ 對象的內存佈局
#include <iostream>
using namespace std;
class Parent
{
public:
Parent(): numInParent(1111)
{}
virtual void Foo()
{
};
virtual void Boo()
{
};
private:
int numInParent;
};
class Child: public Parent
{
public:
Child(): numInChild(2222) {}
virtual void Foo()
{
}
int numInChild;
};
int main(int argc, char *argv[])
{
Child c;
return 0;
}
(gdb) info vtbl this
vtable for 'Parent' @ 0x555555755d68 (subobject @ 0x7fffffffded0):
[0]: 0x555555554a22 <Parent::Foo()>
[1]: 0x555555554a2e <Parent::Boo()>
(gdb) p *this
$1 = (Parent) {
_vptr.Parent = 0x555555755d68 <vtable for Parent+16>,
numInParent = 1111
}
虛函數表 vtable for 'A' @0x405188
(gdb) x/16x 0x555555755d68
0x555555755d68 <vtable for Parent+16>: 0x55554a22 0x00005555 0x55554a2e 0x00005555
0x555555755d78 <typeinfo for Child>: 0xf7dc7438 0x00007fff 0x55554b05 0x00005555
0x555555755d88 <typeinfo for Child+16>: 0x55755d90 0x00005555 0xf7dc67f8 0x00007fff
0x555555755d98 <typeinfo for Parent+8>: 0x55554b10 0x00005555 0x00000001 0x00000000
0x55554a22 補齊為 0x555555554a22
(gdb) x/32x 0x555555554a22
0x555555554a22 <Parent::Foo()>: 0xe5894855 0xf87d8948 0x90c35d90 0xe5894855
0x555555554a32 <Parent::Boo()+4>: 0xf87d8948 0x90c35d90 0xe5894855 0x10ec8348
0x555555554a42 <Child::Child()+8>: 0xf87d8948 0xf8458b48 0xe8c78948 0xffffffac
0x555555554a52 <Child::Child()+24>: 0xef158d48 0x48002012 0x48f8458b 0x8b481089
0x555555554a62 <Child::Child()+40>: 0x40c7f845 0x0008ae0c 0xc3c99000 0xe5894855
0x555555554a72 <Child::Foo()+4>: 0xf87d8948 0x0fc35d90 0x0000801f 0x57410000
0x555555554a82 <__libc_csu_init+2>: 0x89495641 0x415541d7 0x258d4c54 0x0020128e
0x555555554a92 <__libc_csu_init+18>: 0x2d8d4855 0x00201296 0xfd894153 0x4cf68949
(gdb) p /a (*(void ***)this)[0]@3
$6 = {[0x0] = 0x555555554a22 <Parent::Foo()>, [0x1] = 0x555555554a2e <Parent::Boo()>, [0x2] = 0x7ffff7dc7438 <vtable for __cxxabiv1::__si_class_type_info+16>}