如何得出在gdb中处于什么偏移量的成员?

fir*_*ush 3 c++ gcc gdb

GCC 8.3给我以下警告:

error: '*((void*)& request +128)' may be used uninitialized in this function [-Werror=maybe-uninitialized]
Run Code Online (Sandbox Code Playgroud)

我想知道那个偏移量是什么成员。碰巧我有一个核心,可以像这样打印结构化数据以供请求:

(gdb) p *(Request*)request
Run Code Online (Sandbox Code Playgroud)

这将打印出Request的成员,但是有很多,并且从视觉上我并不明显,根据编译器警告,哪个成员的偏移量为128。这不是我第一次尝试在gdb中查找与对象开始位置有一定偏移的成员。通常x/136bx request,在这种情况下,我会尝试通过手动找出问题,然后比较两个输出。但是我想知道:是否有一种方法可以告诉gdb为它以结构化方式打印的每个成员打印偏移量?也就是说,它既可以打印结构化表示形式,又可以为每个成员添加偏移量注释?或者,如果不是那样,相对于打印原始字节并尝试查找该偏移量的字节与哪个成员对齐,是否有一种更聪明的方式让我找到该偏移量的成员?

Emp*_*ian 6

您可能正在寻找maintenance print type Request

对于此程序:

struct Foo {
  int a;
  double d;
  char c[100];
  double e;
};

int main()
{
  Foo f;
  f.e = 1.0;
}
Run Code Online (Sandbox Code Playgroud)

maint print type f 产生:

name 'Foo' (0x2812c60)
code 0x3 (TYPE_CODE_STRUCT)
length 128
...
nfields 4 0x2796480
  [0] bitpos 0 bitsize 0 type 0x27960d0 name 'a' (0x278004a)
...
  [1] bitpos 64 bitsize 0 type 0x2796160 name 'd' (0x2780054)
...
  [2] bitpos 128 bitsize 0 type 0x27963d0 name 'c' (0x278005e)
...
  [3] bitpos 960 bitsize 0 type 0x2796160 name 'e' (0x2780068)
...
Run Code Online (Sandbox Code Playgroud)