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
  • 相关阅读:
    基于Grafana+SimpleJson的灵活报表解决方案
    Scala安装时的坑
    Windows批量添加防火墙例外端口
    VMware与Hyper-V
    InfluxDB:cannot use field in group by clause
    .Net版InfluxDB客户端使用时的一些坑
    KafkaManager中Group下不显示对应Topic的解决方案
    Linux下查看Go语言软件运行情况
    Flink升级到1.4版本遇到的坑
    spring cloud(一)带你进入分布式
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3675630.html
Copyright © 2011-2022 走看看