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
  • 相关阅读:
    Metinfo 5.x 管理员密码重置漏洞
    【CVE-2018-11116】openwrt rpcd 配置文件错误导致访问控制失效
    openwrt-rpcd服务ACL配置错误风险分析
    黑客基础知识
    渗透测试(漏洞利用)
    Niagara物联网框架机制二(笔记)
    基于kali linux无线网络渗透测试
    渗透测试(漏洞扫描)
    Workbench热水泵系统
    Niagara物联网框架机制一(笔记)
  • 原文地址:https://www.cnblogs.com/johnnyflute/p/3675630.html
Copyright © 2011-2022 走看看