代码之家  ›  专栏  ›  技术社区  ›  my_question

如何忽略转储结构时未填充的字段?

gdb
  •  0
  • my_question  · 技术社区  · 8 年前

    我有一个这样的结构:

    struct Foo {
       char *name,
       int priority
    };
    

    我有一个gdb函数来打印结构的内容:

    define p_Foo
       printf "Foo(%lx:\n", $arg0
       set $f = (struct Foo*)$arg0
       printf "name = %s\n", $f.name
       printf "priority = $d\n", $f.priority
    end
    

    问题是,如果未填充名称字段,则上述函数将停止运行,而不打印优先级字段:

    (gdb) p_Foo 0x56000b8bb888
    Foo(56000b8bb888):
    name =Cannot access memory at address 0x400000002
    

    你可以看到优先级没有打印出来。在这种情况下,我需要发出另一个命令来查看这两个字段:

    (gdb)p *$f
    $5 = {
      name = 0x400000002 <Address 0x400000002 out of bounds>,
      priority = 170139020,
    }
    

    我的问题是,我应该如何编写GDB函数p_Foo,以便它可以打印所有字段,即使其中一些字段是野生指针。

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   Employed Russian    8 年前

    我应该如何编写GDB函数p_Foo,以便它可以打印所有字段,即使其中一些字段是通配符。

    您可以实现一个Python漂亮的打印机,如文档所示 here .

    除了能够捕获异常之外,另一个优势是您能够使用 print *(struct Foo*)0x56000b8bb888 (或 p *(strcut Foo*)0x56000b8bb888 )而不是 p_Foo 0x56000b8bb888 .

    推荐文章