C语言 我如何显示一个结构体在GDB中有哪些字段?

bvpmtnay  于 2023-03-17  发布在  其他
关注(0)|答案(9)|浏览(180)

我在GDB(调试器)会话中遇到了一个结构体(名为ngx_http_variable_value_t),我想在控制台中打印它的字段。
这可能吗?

piok6c0g

piok6c0g1#

您可以使用GDB命令ptype打印出结构体或类的定义。
此外,使用ptype /o可以打印结构体中所有字段的偏移量和大小(如pahole)。

dfty9e19

dfty9e192#

如果您有内置的调试符号,您应该只能够打印值:print variableprint *variable(如果它是指向结构的指针)。

6g8kf2rb

6g8kf2rb3#

一月一日

此选项还为p *my_struct_pointer提供换行符和缩进。
你喜欢哪一种:

$2 = {path = {mnt = 0xffff8800070ce1a0, dentry = 0xffff880006850600},last = {{{hash = 3537271320, len = 2}, hash_len = 12127205912}, name = 0xffff88000659501c "../b.out"}

或:

$3 = {
  path = {
    mnt = 0xffff8800070ce1a0, 
    dentry = 0xffff880006850600
  }, 
  last = {
    {
      {
        hash = 3537271320, 
        len = 2
      }, 
      hash_len = 12127205912
    }, 
    name = 0xffff88000659501c "../b.out"
  },
}
kd3sttzy

kd3sttzy4#

除了使用命令行选项之外,您还可以使用图形调试器,我建议使用gdbgui,但是有很多这样的调试器。

免责声明:我是gdbgui的开发者

vcirk6k6

vcirk6k65#

p *((struct my_struct*) variable)

这将帮助您在gdb中打印struct的详细信息

pu82cl6c

pu82cl6c6#

我只通过gdb的图形前端做过这个。在gdb在线文档中找到了这个条目。希望它能有所帮助。我相信这将要求代码是在包含调试信息的情况下创建的。
ptype [arg] ptype接受与whatis相同的参数,但是打印类型的详细描述,而不仅仅是类型的名称。
使用GDB调试:符号

yyhrrdl8

yyhrrdl88#

假设yout变量位于地址X中。您可以执行以下操作:

set $i1 = (ngx_http_variable_value_t *) = X
print *$i1
print *$i1->name_field

下面是一个例子,假设这是我的结构体,并且在地址0x804a008中定义了一个strcut internet类型的变量:

struct internet {
  int priority;
  char *name;
};

(gdb) set $i1 = (struct internet *)0x804a008
(gdb) print *$i1
$17 = {priority = 1, name = 0x804a018 "AAAABBBBCCCCDDDDEEEEt\227\004\b"}
(gdb) print $i1->name
$18 = 0x804a018 "AAAABBBBCCCCDDDDEEEEt\227\004\b"
(gdb) print $i1->priority
$19 = 1
(gdb)
idfiyjo8

idfiyjo89#

将NULL转换为类型指针,然后使用ptype。

(gdb) ptype *(struct iovec*)0
    type = struct iovec {
        void *iov_base;
        size_t iov_len;
    }

或者只是

ptype {struct iovec}0

相关问题