zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【两周一本书】大话设计模式
    如何将在AWS上的网站快速从http转换为https
    java中error和exception的区别
    Java IO : NIO与IO的区别
    TCP/TP:DNS区域(Zone)
    Liferay 7:Liferay DXP解决方案
    Eclipse:Eclipse插件开发全套教程
    Liferay 7:Liferay DXP全套教程内附源码
    Liferay 7:Liferay内部博客地址
    Gradle:gradle下载插件
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3675630.html
Copyright © 2011-2022 走看看