经由GDB用户定义命令返回一个值(Return a value via a gdb user-def

2019-09-22 22:39发布

我有一个核心文件调试,所以我必须要在其中运行任何东西没有主动的过程。

我用gdb用户定义的命令来检查一束从核心文件的数据,并尝试使用简化用户定义的命令的处理。

不过,我不能找到一种方法,使用户定义的命令返回可在其他命令中使用的值。

例如:
(注意,“返回”行注释)

define dump_linked_list
    set $node = global_list->head
    set $count = 1
    while $node != 0
        printf "%p -->", $node
        set $node = $node->next
        set $count = $count + 1
    end
    return $count  ## GDB doesn't understand this return
end

理想情况下,我dump_linked_list命令将返回在列表中找到节点的数量,以便它可以在另一个定义的命令一起使用:

define higher_function
    set $total_nodes = dump_linked_list
    printf "Total Nodes is %d\n", $total_nodes
end

这样的事情可能在gdb命令?

我觉得它一定是的,但我一直在寻找的文件,无法找到它的提及,或任何例子。

Answer 1:

据我所知GDB不具备这样的功能。 您可以设置一些你知道并使用它作为“回报”值名称的变量。 例如总是设置变量RETVAL是这样的:

set $retval = <whatever value>

然后,所有新定义的函数可以用它作为以前称为函数的返回值。 我知道这是唯一的解决办法,但它是相对简单的工作。



Answer 2:

我发现GDB似乎通过它可以用来传回一个返回值的名字来传递。 一个更灵活一点,仅仅使用一个单一的全局变量。

(gdb) define foo
Type commands for definition of "foo".
End with a line saying just "end".
>set $arg0 = 1
>end
(gdb) set $retval = 0
(gdb) p $retval
$3 = 0
(gdb) foo $retval
(gdb) p $retval
$4 = 1


文章来源: Return a value via a gdb user-defined command