C 如何显示结构在GDB中有哪些字段?

C 如何显示结构在GDB中有哪些字段?,c,gdb,C,Gdb,我在GDB(调试器)会话中遇到一个结构(称为ngx\u http\u variable\u value\t),我想打印它在控制台中有哪些字段 这可能吗?如果内置了调试符号,您应该可以打印值:print variable或print*variable,如果它是指向结构的指针。我只通过gdb的图形前端完成了这项工作。在gdb在线文档中找到此条目。希望能有帮助。我相信这将要求代码创建时包含调试信息 p类型[arg] ptype接受与whatis相同的参数,但打印类型的详细描述,而不仅仅是类型的名称 我

我在GDB(调试器)会话中遇到一个结构(称为
ngx\u http\u variable\u value\t
),我想打印它在控制台中有哪些字段


这可能吗?

如果内置了调试符号,您应该可以打印值:
print variable
print*variable
,如果它是指向结构的指针。

我只通过gdb的图形前端完成了这项工作。在gdb在线文档中找到此条目。希望能有帮助。我相信这将要求代码创建时包含调试信息

p类型[arg] ptype接受与whatis相同的参数,但打印类型的详细描述,而不仅仅是类型的名称


我想看看。

您可以使用GDB命令
ptype
打印出结构或类的定义


此外,使用
ptype/o
打印结构中所有字段的偏移量和大小(如pahole)。

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


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

此选项还为
p*my\u struct\u指针
提供换行和缩进

您喜欢哪一种:

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


这将帮助您打印gdb中结构的详细信息

,如果变量是一个通用指针,例如void*,您可以将其转换为必要的类型,
print((MY_struct*)variable)
,或者获取结构的特定元素
print((MY_struct*)variable->MY_structure_element
。这是正确的答案。例如。”(gdb)ptype tm“”type=struct tm{int tm_sec;int tm_min;int tm_hour;int tm_mday;int tm_mon;int tm_year;int tm_yday;int tm_isdst;long tm_gmtoff;const char*tm_zone}“偏移量呢?@ConradMeyer我用它来表示偏移量:
(gdb)p&((struct foo*)0)->member
。如果有一些非黑客的东西就好了。@domen是的,那也是我的黑客。同时也在寻找一些非黑客的东西,可以更快地键入:-)。@ConradMeyer将
宏定义偏移量(t,f)&((t*)0)->f
放入
~/.gdbinit
。然后,您可以使用
(gdb)p offsetof(struct foo,member)
。该链接为dead。您使用什么mi命令从gdb获取此信息?如果您正在运行gdbgui,您可以代表gdbgui查看发送到gdb的所有命令。要执行此操作,请转到设置(齿轮图标)并选中显示“在控制台中打印所有发送的命令,包括gdbgui自动发送的命令”的框。否则,您可以检查源代码。
$3 = {
  path = {
    mnt = 0xffff8800070ce1a0, 
    dentry = 0xffff880006850600
  }, 
  last = {
    {
      {
        hash = 3537271320, 
        len = 2
      }, 
      hash_len = 12127205912
    }, 
    name = 0xffff88000659501c "../b.out"
  },
}
  p *((struct my_struct*) variable)