我正在尝试检查核心转储中数据结构的内容。这个中有很多节点。我需要比较两个节点。我正在尝试实现与程序用来作为用户定义的gdb函数处理数据结构相同的比较函数。一个节点具有多个参数,比较函数会检查每个参数并返回-1、0或1。
我做了以下事情,
define single_compare
if $arg0 > $arg1
set $arg2 = 1
end
if $arg0 < $arg1
set $arg2 = -1
end
if $arg0 == $arg1
set $arg2 = 0
end
end
define compare_nodes
set $obj_inst_a = (nodetype*)$arg0
set $obj_inst_b = (nodetype*)$arg1
set $compr = 0
single_compare $obj_inst_a->a $obj_inst_b->a $compr
if $compr != 0
set $arg2 = $compr
end
single_compare $obj_inst_a->b $obj_inst_b->b $compr
if $compr != 0
set $arg2 = $compr
end
...
这里的问题是,如果我发现每个节点中的a值都不相同,则无需比较b,只需从那里返回,然后使用$ arg2即可做出决定。有没有办法在gdb脚本中做到这一点?完成/返回将导致当前程序功能返回/完成。不是脚本。
答案 0 :(得分:1)
没有直接的方法可以做到这一点。如您所见,gdb的CLI语言受到一定限制。
一种获得所需结果的方法是将函数的主体包装在仅执行一次的循环中:
set var $w = 1
while $w
if something
# Here's how to exit early.
loop_break
end
# Make sure this only loops once.
set var $w = 0
end
另一种方法是使用Python编写更复杂的脚本。