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

时间:2018-07-24 22:32:36

标签: gdb

我有一个这样的结构:

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 个答案:

答案 0 :(得分:1)

  

我应该如何编写GDB函数p_Foo,以便即使某些字段是野生指针,它也可以打印所有字段。

您可以实现here中所述的Python漂亮打印机。

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