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 回答