如何显示结构体在GDB中的哪些字段?

pri*_*ing 62 c gdb

我遇到了一个ngx_http_variable_value_t在我的GDB会话中调用的结构,我想打印它在控制台中的字段.

那可能吗?

Nat*_*ate 110

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

  • 这是正确的答案.例如"(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_wday; int tm_yday; int tm_isdst; long tm_gmtoff; const char*tm_zone;} " (5认同)
  • 抵消怎么样? (3认同)
  • @ConradMeyer把`macro define offsetof(t,f)&((t*)0) - > f)`放到`〜/ .gdbinit`中.然后你可以使用`(gdb)p offsetof(struct foo,member)`. (3认同)
  • @ConradMeyer我将其用于偏移量:((gdb)p&((struct foo *)0)-> member`。拥有一些非骇客的东西会很好。 (2认同)

Lnx*_*gr3 57

如果你有内置的调试符号,你应该只能打印值:print variable或者print *variable它是一个指向结构的指针.

  • 如果变量是通用指针,例如void*,则可以将其转换为必要的类型,`print((MY_STRUCT*)variable)`,或者获取结构`print的特定元素((MY_STRUCT*) )可变> my_structure_element`. (4认同)

Cir*_*四事件 13

set print pretty on

此选项还提供换行符和缩进p *my_struct_pointer.

你喜欢哪个:

$2 = {path = {mnt = 0xffff8800070ce1a0, dentry = 0xffff880006850600},last = {{{hash = 3537271320, len = 2}, hash_len = 12127205912}, name = 0xffff88000659501c "../b.out"}
Run Code Online (Sandbox Code Playgroud)

要么:

$3 = {
  path = {
    mnt = 0xffff8800070ce1a0, 
    dentry = 0xffff880006850600
  }, 
  last = {
    {
      {
        hash = 3537271320, 
        len = 2
      }, 
      hash_len = 12127205912
    }, 
    name = 0xffff88000659501c "../b.out"
  },
}
Run Code Online (Sandbox Code Playgroud)


cs0*_*s01 5

除了使用命令行选项外,您还可以使用图形调试器.我建议gdbgui,但那里有很多.

截图

免责声明:我是gdbgui的开发人员


小智 5

  p *((struct my_struct*) variable)
Run Code Online (Sandbox Code Playgroud)

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