• gdb查看虚函数表、函数地址


    1. 查看函数地址
        看函数在代码的哪一行,使用info line就可以看到类似下面这中输出

    点击(此处)折叠或打开

    1. (gdb) info line a.cpp:10
    2. Line 10 of "a.cpp" starts at address 0x80487d4 <_ZN1B5test2Ev> and ends at 0x80487d7 <_ZN1B5test2Ev+3>.
    3. (gdb) p _ZN1B5test2Ev
    4. $1 = {void (B * const)} 0x80487d4
    5. (gdb)

        可以直接根据函数地址去打断点,当然如果知道文件和行号其实没必要拐个弯来打这种费解的断点,应用场合更多是想使用汇编调试的时候。

    点击(此处)折叠或打开

    1. 16 public:
    2. 17 virtual void test2(){
    3. 18 cout << "If I'm lying, I'm crying!" << endl;
    4. 19 }
    5. 20
    6. (gdb) info line 17
    7. Line 17 of "a.cpp" starts at address 0x8048808 <_ZN1D5test2Ev> and ends at 0x804880e <_ZN1D5test2Ev+6>.
    8. (gdb) b *0x804880e
    9. Note: breakpoint 2 also set at pc 0x804880e.
    10. Breakpoint 3 at 0x804880e: file a.cpp, line 18.
     
    2. 查看虚函数表
        如果仅仅是想知道当前对象的真实类别,那使用这句就可以看到了(示例里面的b实际上是D类对象,而非B类)。

    点击(此处)折叠或打开

    1. (gdb) set print object on
    2. (gdb) p b
    3. $3 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }
        查看对象里面的虚指针,也很简单,把虚指针指向的内容显示一下就可以了。

    点击(此处)折叠或打开

    1. (gdb) p b
    2. $6 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }
    3. (gdb) p /a *(void**)0x8048948@2
    4. $7 = {0x8048834 <_ZN1D4testEv>, 0x8048808 <_ZN1D5test2Ev>}
        查看虚表的前面,会发现g++实现的时候将RTTI信息放到虚函数表的前面一点点了。反汇编查看代码其实也可以发现的,typeid会根据虚表指针偏移一下去找RTTI信息。

    点击(此处)折叠或打开

    1. (gdb) p /a *((void**)0x8048948-1)
    2. $18 = 0x8048950 <_ZTI1D>

    点击(此处)折叠或打开

    1. sles10sp1:~/test # c++filt _ZTI
  • 相关阅读:
    C#对文件的操作
    Quartz使用
    北邮校园网自动登录 python
    interactive python ---- week5
    interactive python ----pong game
    自旋锁(spinlock)(转)
    interactive python(3)
    interactive python(2)
    Ubuntu下为Firefox安装Adobe Flash Player(转)
    flex中list 控件行中添加Button后的点击事件处理
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3675630.html
Copyright © 2020-2023  润新知