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 に答える