【问题标题】:How do I show what fields a struct has in GDB?如何显示结构在 GDB 中具有哪些字段?
【发布时间】:2010-12-18 14:59:30
【问题描述】:

我在我的 GDB(调试器)会话中发现了一个结构(称为 ngx_http_variable_value_t),我想在控制台中打印它的字段。

这可能吗?

【问题讨论】:

    标签: c gdb


    【解决方案1】:

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

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

    【讨论】:

    • 这是正确的答案。例如"(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; } "
    • 偏移量呢?
    • @ConradMeyer 我将它用于偏移量:(gdb) p &((struct foo *)0)->member。有一些非hacky的东西会很好。
    • @domen 是的,这也是我的 hack。也在寻找一些非hacky和更快的输入:-)。
    • @ConradMeyer 将macro define offsetof(t, f) &((t *) 0)->f) 放入~/.gdbinit。然后你可以使用(gdb) p offsetof(struct foo, member)
    【解决方案2】:

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

    【讨论】:

    • 如果变量是一个泛型指针,比如一个void*,你可以将它强制转换为必要的类型,print ((MY_STRUCT *)variable),或者获取结构体的特定元素print ((MY_STRUCT *)variable->my_structure_element
    【解决方案3】:

    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"}
    

    或:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 您使用什么 mi 命令从 gdb 获取此信息?
      • 如果您正在运行 gdbgui,您可以查看代表 gdbgui 发送到 gdb 的所有命令。为此,请转到设置(齿轮图标)并选中“在控制台中打印所有发送的命令,包括那些由 gdbgui 自动发送的命令”框。否则你可以查看源代码github.com/cs01/gdbgui
      【解决方案5】:
        p *((struct my_struct*) variable)
      

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

      【讨论】:

        【解决方案6】:

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

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

        Debugging with GDB:Symbols

        【讨论】:

        • 链接失效
        【解决方案7】:

        我想看看Data Display Debugger

        【讨论】:

          猜你喜欢
          • 2012-09-19
          • 2015-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-05
          相关资源
          最近更新 更多