请考虑C中的以下代码:
typedef struct {
union {
struct {
int x:16;
int y:16;
};
int combi_xy;
};
} T_MY_STRUCT;
现在有了GDB,我想看一下这个结构的设置。我这样做是用ptype:
(gdb) ptype T_MY_STRUCT
type = struct {
union {
struct {...};
int combi_xy;
};
}
但是这个结果对我来说并不是很令人满意,因为内部结构(x和y)的所有内容都被隐藏/替换为{...}。无论如何都可以看到内部结构的内容吗?是否有一些选项可以设置ptype的嵌套深度?或者甚至可以选择扩展整个结构,无论嵌套结构的数量是多少?
作为一个注释,如果我可以扩展一个等于示例中的嵌套级别,我会很好。
答案 0 :(得分:1)
gdb中似乎没有任何功能来控制打印的嵌套级别。代码在/binutils-gdb/gdb/c-typeprint.c中,但很难遵循。
我能做的最好的事情是打印一个实际的实例。
ptype也可以在实例上使用。如果命名了嵌套结构,则可以使用ptype向下钻取。
typedef struct {
union {
struct {
int x:16;
int y:16;
}inner;
int combi_xy;
};
} T_MY_STRUCT;
void main()
{
T_MY_STRUCT a;
a.combi_xy = 5;
}
gdb在上面的内容中有如下说法
(gdb) p a
$1 = {{inner = {x = -8208, y = -1}, combi_xy = -8208}}
(gdb) ptype a
type = struct {
union {
struct {...} inner;
int combi_xy;
};
}
(gdb) ptype a.inner
type = struct {
int x : 16;
int y : 16;
}
答案 1 :(得分:1)
您可以使用Python和gdb.lookup_type(),gdb.Type.fields()等。
答案 2 :(得分:0)
当提供 /o
标志(以包含偏移量)时,内部结构被扩展,但您必须忽略产生的注释。下面是一个示例,其中 struct __local_data.private 有一个匿名联合,该联合被普通 pstate
隐藏,但通过 pstate/o
显示:
(gdb) ptype struct __locale_data
type = struct __locale_data {
const char *name;
const char *filedata;
off_t filesize;
enum {ld_malloced, ld_mapped, ld_archive} alloc;
struct {
void (*cleanup)(struct __locale_data *);
union {...};
} private;
unsigned int usage_count;
int use_translit;
unsigned int nstrings;
union locale_data_value values[];
}
对比:
(gdb) ptype/o struct __locale_data
/* offset | size */ type = struct __locale_data {
/* 0 | 8 */ const char *name;
/* 8 | 8 */ const char *filedata;
/* 16 | 8 */ off_t filesize;
/* 24 | 4 */ enum {ld_malloced, ld_mapped, ld_archive} alloc;
/* XXX 4-byte hole */
/* 32 | 16 */ struct {
/* 32 | 8 */ void (*cleanup)(struct __locale_data *);
/* 40 | 8 */ union {
/* 8 */ void *data;
/* 8 */ struct lc_time_data *time;
/* 8 */ const struct gconv_fcts *ctype;
/* total size (bytes): 8 */
};
/* total size (bytes): 16 */
} private;
/* 48 | 4 */ unsigned int usage_count;
/* 52 | 4 */ int use_translit;
/* 56 | 4 */ unsigned int nstrings;
/* XXX 4-byte hole */
/* 64 | 0 */ union locale_data_value values[];
/* total size (bytes): 64 */
}