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为它以结构化方式打印的每个成员打印偏移量?也就是说,它既可以打印结构化表示形式,又可以为每个成员添加偏移量注释?或者,如果不是那样,相对于打印原始字节并尝试查找该偏移量的字节与哪个成员对齐,是否有一种更聪明的方式让我找到该偏移量的成员?
您可能正在寻找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)