查看虚函数表
来源:互联网 发布:三维文字制作软件 编辑:程序博客网 时间:2024/05/22 15:26
关于虚函数表的介绍:http://blog.csdn.net/haoel/article/details/1948051/
http://blog.csdn.net/hackbuteer1/article/details/7883531
上网搜了半天,没找到好的,自己看了一下,在linux的gdb环境下有比较简单的方法可以看
在blog里记录一下,免得自己忘了
1. 查看函数地址
看函数在代码的哪一行,使用info line就可以看到类似下面这中输出
点击(此处)折叠或打开
- (gdb) info line a.cpp:10
- Line 10 of "a.cpp" starts at address 0x80487d4 <_ZN1B5test2Ev> and ends at 0x80487d7 <_ZN1B5test2Ev+3>.
- (gdb) p _ZN1B5test2Ev
- $1 = {void (B * const)} 0x80487d4
- (gdb)
点击(此处)折叠或打开
- 16 public:
- 17 virtual void test2(){
- 18 cout << "If I'm lying, I'm crying!" << endl;
- 19 }
- 20
- (gdb) info line 17
- Line 17 of "a.cpp" starts at address 0x8048808 <_ZN1D5test2Ev> and ends at 0x804880e <_ZN1D5test2Ev+6>.
- (gdb) b *0x804880e
- Note: breakpoint 2 also set at pc 0x804880e.
- Breakpoint 3 at 0x804880e: file a.cpp, line 18.
2. 查看虚函数表
如果仅仅是想知道当前对象的真实类别,那使用这句就可以看到了(示例里面的b实际上是D类对象,而非B类)。
点击(此处)折叠或打开
- (gdb) set print object on
- (gdb) p b
- $3 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }
查看对象里面的虚指针,也很简单,把虚指针指向的内容显示一下就可以了。
点击(此处)折叠或打开
- (gdb) p b
- $6 = (D &) @0xbfe3116c: { = {_vptr.B = 0x8048948}, }
- (gdb) p /a *(void**)0x8048948@2
- $7 = {0x8048834 <_ZN1D4testEv>, 0x8048808 <_ZN1D5test2Ev>}
点击(此处)折叠或打开
- (gdb) p /a *((void**)0x8048948-1)
- $18 = 0x8048950 <_ZTI1D>
点击(此处)折叠或打开
- sles10sp1:~/test # c++filt _ZTI1D
- typeinfo for D
PS:
在VC的IDE环境中的Debug状态下展开类的实例也可以看到虚函数表。
C++的多态是基于虚指针来实现的,如果不小心导致虚指针的值被改写了(最常见的错误就是对一个包含虚指针的对象执行了memset操作),就可能导致程序core掉。
而调用虚函数、使用dynamic_cast以及typeid都会使用到虚指针,所以当程序core这些需要在呈现多态的地方,不必感到太惊讶。
另外大多数编译器对虚指针的赋值是在构造函数里面进行的,而这部分赋值代码是编译器自行插入的。
0 0
- 查看虚函数表
- C++虚函数与虚函数表(编译器查看)
- gdb查看内存地址和栈中的值—查看虚函数表、函数地址
- 通过交换虚函数表指针查看虚函数的实现方式
- Windbg 查看MFC类重载虚函数
- Windbg 查看MFC类重载虚函数
- 可查看ABAP表结构的函数
- 具有虚函数的类的大小 & VS2010命令行查看虚函数表和类内存布局
- 具有虚函数的类的大小 & VS2010命令行查看虚函数表和类内存布局
- 右边的类对象决定查看的虚函数表..左边的类型调用非函数表
- VS2010命令行下查看虚函数表和类内存布局
- VS2010命令行下查看虚函数表和类内存布局
- VS2010命令行下查看虚函数表和类内存布局
- 查看虚函数表和类内存布局,以及使用MSVC与GCC hack验证
- 使用VS开发人员命令提示符查看C++虚函数表及类内存分布
- 查看过程、函数源代码
- java函数查看文件大小
- 查看时间调用函数
- Material Design 之NavigationView(导航视图)
- OpenGL入门(二):第一个OpenGL程序
- 使用Notepad++快速有效删除复制代码中的行号
- String 常用方法
- Google ZXing系列讲解(五)——ZXing 仿微信扫描UI
- 查看虚函数表
- The first C# program
- Storm处理流程, 基本参数配置
- HTTP的头信息详解
- Magento相关产品(Related Product)推荐销售(Up-sells)和交叉销售(Cross-sells)
- 个人使用
- ionic 中使用pouchdb + sqlite安装
- Json格式日期转换问题
- vb.net 读取excel 发生 HRESULT:0x800A03EC 情况之一