6

我正在使用核心文件进行调试,所以我没有运行任何东西的活动进程。

我正在使用 gdb 用户定义的命令来检查核心文件中的一堆数据,并尝试使用用户定义的命令来简化该过程。

但是,我找不到使用户定义的命令返回可用于其他命令的值的方法。

例如:(
注意“return”行的注释)

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 命令中是否可能发生这样的事情?

我觉得一定是这样,但我一直在搜索文档,但找不到提及它或任何示例。

4

2 回答 2

5

我发现 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
于 2013-02-07T10:04:57.140 回答
1

据我所知,GDB 没有这样的功能。您可以设置一个您知道的名称的变量并将其用作“返回”值。例如,总是像这样设置变量retval

set $retval = <whatever value>

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

于 2012-09-24T20:56:40.147 回答