[英]displaying with ptype all C++ data fields (even inherited) in GDB
在C ++ 11程序中(在Linux / Debian / x86-64上与GCC 5一起编译 ,带有g++ -Og -g3 -Wall -std=c++11 b.cc -o bprog
),当您具有类层次结构时例如在此文件b.cc
:
#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;
}
并使用最新的GDB (即7.10),我想显示该类型的所有数据字段(如果有的话甚至是vtable指针)。 使用ptype
命令不是很有帮助(因为不会显示继承的字段):
(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);
}
大部分动机是我正在与GCCJIT (或也许是其他一些JIT库,但可能还有GCCJIT)进行交互,当然,JITing代码需要了解实现细节,例如每个数据字段的类型和偏移量。 如果您对更多细节感兴趣,请参阅此线程 。
例如,JIT-er应该内联到bobj.b3vl[i]
的读取访问权限,因此我需要了解机器布局...
我知道C ++标准容器和字符串中的字段是特定于实现的(但我确实知道它们在实际中相差不大,但变化不大)
您是否有任何技巧或窍门可以通过GDB轻松获取所有(字段名称,类型和偏移量)信息(包括继承字段的信息)?
我认为没有gdb内置的方法可以做到这一点。 请参阅此gdb功能请求 。
但是,可以使用Python相对轻松地完成此操作。 如果您拥有pahole
gdb命令(不是上游gdb的一部分,但至少是在Fedora中提供的),那么就可以解决问题(尽管现在看起来似乎确实很丑陋)。 至少将显示如何编写代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.