在GDB中使用ptype设置扩展结构的深度

时间:2016-09-02 14:50:09

标签: c gdb

请考虑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的嵌套深度?或者甚至可以选择扩展整个结构,无论嵌套结构的数量是多少?

作为一个注释,如果我可以扩展一个等于示例中的嵌套级别,我会很好。

3 个答案:

答案 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 */
                         }