我有一个这样的结构:
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,以便即使某些字段是野生指针也可以打印所有字段。
谢谢。
答案 0 :(得分:1)
我应该如何编写GDB函数p_Foo,以便即使某些字段是野生指针,它也可以打印所有字段。
您可以实现here中所述的Python漂亮打印机。
除了能够捕获异常之外,另一个优点是您可以使用print *(struct Foo*)0x56000b8bb888
(或p *(strcut Foo*)0x56000b8bb888
)而不是p_Foo 0x56000b8bb888
。