GDB:从脚本中的用户定义函数返回

时间:2018-07-12 04:55:42

标签: gdb

我正在尝试检查核心转储中数据结构的内容。这个中有很多节点。我需要比较两个节点。我正在尝试实现与程序用来作为用户定义的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脚本中做到这一点?完成/返回将导致当前程序功能返回/完成。不是脚本。

1 个答案:

答案 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编写更复杂的脚本。