【问题标题】:Print C++ vtables using GDB使用 GDB 打印 C++ vtables
【发布时间】:2011-09-05 16:59:26
【问题描述】:

我正在尝试使用 gdb 打印对象的 vtable;我找到了

show print vt bl on

设置,但我仍然不知道如何打印 vtable - p *object 仍然不打印出来。

如何打印 vtable?

【问题讨论】:

  • 查看程序集,对同一个函数的两个虚函数调用会通过不同的偏移量到 vtable,从而导致段错误。我正在尝试调试这个问题。
  • 你能发布一些环境代码吗?也许这是一个我们可以在不通过程序集的情况下发现的错误。

标签: c++ gdb


【解决方案1】:

更紧凑的解决方案:

p /a (*(void ***)obj)[0]@10

【讨论】:

  • 或者更简洁:x/10a *(void**)obj,尽管它也会打印方法指针的地址(即&ptr)。
【解决方案2】:

如果您有足够新的 gdb 版本,您可能需要查看“info vtbl”命令。

我只在谷歌搜索此问题的答案时才注意到该功能,并且我注意到大约 2012 年在 gdb 邮件列表中的帖子,尤其是 2012 年 3 月的帖子:

http://permalink.gmane.org/gmane.comp.gdb.patches/73957

【讨论】:

    【解决方案3】:
    (gdb) 设置 $i = 0 (gdb) 而 $i 打印$i >p /a (*(void ***)obj)[$i] >设置 $i = $i + 1 >结束

    其中“obj”是您要打印其 vtable 的对象,10 是方法数。

    【讨论】:

      【解决方案4】:

      在实际的 gdb 7.5.1 中,该命令是 not info vtable!

      使用 信息vtbl

      【讨论】:

        【解决方案5】:

        例如http://en.cppreference.com/w/cpp/language/virtual

        不使用'info vtbl'

        (gdb) p b
        $1 = {_vptr.Base = 0x400a60 <vtable for Base+16>}
        
        (gdb) x/16x 0x400a60
        0x400a60 <_ZTV4Base+16>:    0x0040094c  0x00000000  0x72654437  0x64657669
        
        (gdb) x/16x 0x0040094c
        0x40094c <Base::f()>:   0xe5894855  0x10ec8348  0xf87d8948  0x400a15be
        0x40095c <Base::f()+16>:    0x10c0bf00  0xf9e80060  0xc9fffffd  0x485590c3
        0x40096c <Derived::f()+2>:  0x8348e589  0x894810ec  0x1bbef87d  0xbf00400a
        0x40097c <Derived::f()+18>: 0x006010c0  0xfffddbe8  0x66c3c9ff  0x00841f0f
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-12
          • 2010-12-21
          • 1970-01-01
          • 1970-01-01
          • 2022-11-27
          • 1970-01-01
          相关资源
          最近更新 更多