通过gdb用户定义的命令返回值

时间:2012-09-24 20:44:20

标签: debugging gdb core-file

我正在使用核心文件进行调试,因此我没有可以运行任何内容的活动进程。

我正在使用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命令中是否可以这样做?

我觉得它一定是,但我一直在搜索文档,无法找到它或任何例子。

2 个答案:

答案 0 :(得分:3)

我发现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

答案 1 :(得分:1)

据我所知,GDB没有这样的功能。您可以设置您知道的某个名称的变量,并将其用作“返回”值。例如,始终设置变量 retval ,如下所示:

set $retval = <whatever value>

然后,所有新定义的函数都可以将它用作先前调用的函数的返回值。我知道这只是解决方法,但它相对简单而且有效。