gdb命令x/nfu输出中ZTV、ZTS、ZTI的含义?附C++虚表示例
聊聊GDB里虚表相关的ZTV、ZTS、ZTI符号含义
嘿,这几个符号其实是GCC、Clang这类编译器遵循Itanium C++ ABI标准做的名字修饰(name mangling)结果,用来区分C++里和虚表、RTTI(运行时类型信息)相关的核心结构。结合你给出的Derived类示例,我给你逐个拆解:
ZTV:类的虚表(Virtual Table)
- 拆解符号逻辑:前缀
_Z是C++修饰符号的标志,后面的TV对应Table Virtual,所以ZTV合起来就是虚表的标识。 - 你示例里的
_ZTV7Derived就是Derived类的虚表本身。虚表本质是存储虚函数指针的数组,开头通常会有两个特殊条目:第一个是空指针(不同实现略有差异),第二个是指向类型信息对象(ZTI)的指针,后面才是类的各个虚函数的地址。
ZTS:类型信息结构(Typeinfo Structure)
ZTS对应Typeinfo Structure,_ZTS<类名>就是类的RTTI结构的符号名。- 这个结构里存着类的核心类型信息,比如类的名称字符串,是
typeid操作和dynamic_cast能工作的基础——程序运行时靠它识别对象的实际类型。
ZTI:类型信息对象(Typeinfo Instance)
ZTI对应Typeinfo Instance,_ZTI<类名>是类的类型信息实例的符号名。- 它相当于ZTS结构的"入口",虚表的第二个条目(跳过开头的空指针后)通常就指向这个ZTI对象,通过它就能关联到对应的ZTS结构,从而拿到完整的类型信息。
举个和你示例匹配的对应关系:
对于Derived类:
_ZTV7Derived→ Derived的虚表(就是你用x/300xb查看的那个地址)_ZTI7Derived→ Derived的类型信息实例(你示例里0x400b38位置的指针指向的就是它)_ZTS7Derived→ Derived的类型信息结构(由_ZTI7Derived指向,里面能找到"Derived"这个类名字符串)
内容的提问来源于stack exchange,提问作者JellyHan
相关产品推荐
相关产品推荐

