28

gdb では、コマンドを使用して既に宣言されている変数を設定できることを知っていますset

gdb が特定の関数のスコープ内で新しい変数を動的に宣言することは可能ですか?

4

3 に答える 3

31

いくつかのスペースを動的に割り当て、それを使用して新しい変数を格納できます。「現在の関数のスコープ」の意味によっては、必要なものではない場合があります。

しかし、出力パラメーターへのポインターを取る関数 func() がある場合、次のようになります。

set $foo = malloc(sizeof(struct funcOutStruct))
call func($foo)
p *$foo
call free($foo)
于 2014-02-10T07:52:03.377 に答える
20

C (およびおそらく C++) コードの場合、ほとんどの実装でこれを行うにはスタック ポインターをシフトする必要があり、スタック フレームのサイズと一致しなくなるため、関数の終了コードが失敗するため、これは非常に困難です。また、ローカル変数にアクセスする関数内のすべてのコードは、突然間違った場所にヒットする危険性があり、これも悪いことです。

だから、私はそうは思いません。

于 2012-04-23T16:09:16.310 に答える
7

それが私が変数を出力するために使用した方法です

(gdb) set $path=((ngx_path_t     **)ngx_cycle->paths.elts)[2]
(gdb) print *$path
    $16 = {
        name = {
            len = 29,
            data = 0x80ed15c "/usr/local/nginx/fastcgi_temp"
            },
        len = 5,
        level = {1, 2, 0},
        manager = 0,
        loader = 0,
        data = 0x0,
        conf_file = 0x0,
        line = 0
    }
于 2013-09-10T06:13:43.133 に答える