使用ptype显示GDB中的所有C ++数据字段(甚至是继承的)

时间:2015-09-18 16:01:29

标签: linux c++11 gcc gdb

在C ++ 11程序中(使用GCC 5在Linux / Debian / x86-64上编译,使用g++ -Og -g3 -Wall -std=c++11 b.cc -o bprog),当你有一个类层次结构时,例如在这个文件中{{1} }:

b.cc

并使用最近的GDB(即7.10)我想显示所有数据字段(甚至可能是vtable指针[s],如果有的话)的类型。使用 #include <string> #include <vector> class A { int a1i; double a2d; public: A(int x, double y) : a1i(x), a2d(y) {}; ~A() = default; }; class B : public A { std::string b1s; int b2ii[2]; std::vector<long> b3vl; public: B (int x, double y, const char*s, int a, int b) : A(x,y), b1s(s), b2ii{a,b}, b3vl{x,a,b,x+a,a*b} {}; ~B() = default; }; int main(int argc, char**argv) { B bobj {1,2.1,"bname",3,4}; return 0; } 命令不是非常有用(因为不显示继承的字段):

ptype

大多数动机是我与GCCJIT(或者某些其他JIT库接口,但可能是GCCJIT),当然JITing代码需要知道类型和偏移等实现细节每个数据字段。如果您对更多详细信息感兴趣,请参阅this thread

例如,JIT-er应该对 (gdb) ptype B type = class B : public A { private: std::__cxx11::string b1s; int b2ii[2]; std::vector<long, std::allocator<long> > b3vl; public: B(int, double, const char *, int, int); ~B(int); } 进行读取访问,因此我需要了解机器布局...

我知道C ++标准容器和字符串中的字段是特定于实现的(但我确实知道它们不会变化那么多,但实际上只是一点点)

您是否有任何技巧或提示可以通过GDB(包括继承的字段)轻松获取所有信息(字段名称,类型和偏移)信息?

1 个答案:

答案 0 :(得分:1)

我认为有一种方法可以实现gdb内置的功能。请参阅this gdb feature request

但是,它可以通过Python相对容易地完成。如果你有pahole gdb命令(不是上游gdb的一部分,但至少在Fedora中提供),那就可以了(虽然它现在似乎产生了非常难看的输出)。它至少会显示如何编写代码。